1. 程式人生 > >Linux學習閑談(一)——Shell基本操作與命令

Linux學習閑談(一)——Shell基本操作與命令

模式 http 方括號 -a ali 入參 post lac 變量引用

Linux學習閑談(一)

——Shell基本操作與命令

(轉載請附上本文鏈接——linhxx)

1、#!/bin/sh

放在程序開頭,表示用/bin/sh方式來解析。

2、變量

1)變量賦值 varname=’xxx’,除了在變量賦值和在FOR循環語句頭中,其他情況下BASH 中的變量使用必須在變量前加"$"符號,即采用 $varname使用變量。更為標準的變量引用方式是 ${STR} 這樣的,$STR 自不過是對 ${STR} 的一種簡化。在復雜情況下(即有可能產生歧義的地方)最好用帶 {} 的表示方式。

2)給變量賦值時,等於號=兩邊都不能有空格。

3)local定義局部變量,export定義全局變量。

4)保留變量:

$IFS  這個變量中保存了用於分割輸入參數的分割字符,默認是空格。

$HOME  這個變量中存儲了當前用戶的根目錄路徑。

$PATH  這個變量中存儲了當前 Shell 的默認路徑字符串。

$PS1  表示第一個系統提示符。

$PS2  表示的二個系統提示符。

$PWD  表示當前工作路徑。

$EDITOR 表示系統的默認編輯器名稱。

$BASH  表示當前 Shell 的路徑字符串。

$RANDOM 隨機的生成一個大小在 1 到 65536 之間的整數。

5)變量的特殊操作:

${var-default} 表示如果變量 $var 還沒有設置,則保持 $var 沒有設置的狀態,並返回後面的默認值 default。

${var=default} 表示如果變量 $var 還沒有設置,則取後面的默認值 default。

${var+otherwise} 表示如果變量 $var 已經設置,則返回 otherwise 的值,否則返回空( null )。

${var?err_msg} 表示如果變量 $var 已經設置,則返回該變量的值,否則將後面的 err_msg 輸出到標準錯誤輸出上。

${var#pattern},${var##pattern} 用於從變量 $var 中剝去最短(最長)的和 pattern 相匹配的最左側的串。

${var%pattern},${var%%pattern} 用於從變量 $var 中剝去最短(最長)的和 pattern 相匹配的最右側的串。

${var:pos} 表示去掉變量 $var 中前 pos 個字符。

${var:pos:len} 表示變量 $var 中去掉前 pos 個字符後的剩余字符串的前 len 個字符。

${var/pattern/replacement} 表示將變量 $var 中第一個出現的 pattern 模式替換為 replacement 字符串。

${var//pattern/replacement} 表示將變量 $var 中出現的所有 pattern 模式全部都替換為 replacment 字符串。

3、&& 和 || 以及 |

1)a && b 表示先執行a,成功再執行b。

2)a||b表示執行a,成功就不執行b,否則執行b。

3)a|b 表示先執行a,執行的結果用在執行b的過程。

4、特殊符號

1)# 用於開頭表示定義,用於其他行的行首表示本行註釋不執行

2); 多個語句放在同一行用此分隔。

3);; 在使用case時,作為每個選項的結束。

 varname=b

 case "$varbname" in

  [a-z]) echo "abc";;

  [0-9]) echo "123";;

 esac

4)單引號和雙引號:同php

5)` (反引號),將命令執行的結果輸出到變量。

cp `mkdir back` test.sh back ,反引號中的先執行,然後執行拷貝cp命令。

6):

1. 空命令 bash的一個內建命令,退出碼是0。與 true作用相同。

2. 變量擴展/字串替換 : > 文件 清空了這個文件 和 cat 、dev/null 文件 作用相同。但用 :不會產生新進程,因為是內建命令。

7)小括號 ()

1. 命令組,將括號內部的命令當做子shell,對腳本剩余部分不可用,變量存在作用域的問題。下列輸出的結果是123,即小括號內的在小括號外沒用。

a=123

( a=321;)

echo "a = $a"

2. 初始化數組:arr=(1 3 5 7 9)

8)大括號{}

1. 文件名擴展 cp t.{txt,bak} 復制 t.txt 的內容到 t.bak 中

2. 代碼塊,和小括號相反,大括號外面仍然可以使用裏面的變量。下面輸出321。

a=123

{ a=321;}

echo "a = $a"

9)中括號[]

1. if等條件放在中括號中 if [ $a -gt 10 ] ,方括號兩邊需要留空格。

2. 用來引用數組元素,同PHP

10)<、>與<<、>>

首先,兩個符號和一個符號的相比,兩個符號的是輸出內容追加到文件後面,一個符號的意思是直接輸出到文件(覆蓋原來的內容)。

其次,符號表示重定向,大於小於用-gt和-lt。

例子:sort >>name.txt <<hello

1. sort >>name.txt 將sort命令的結果屏蔽輸出並重定向追加到name.txt文件尾部(重定向標準輸出)。

2. name.txt<<hello執行name.txt,以hello作為所需要的輸入內容(重定向標準輸入)。

附加內容:

linux輸入輸出三種標準:標準輸入、標準輸出、標準錯誤輸出,分別是0/1/2,組合起來使用是 sort > name.txt 即sort 1> name.txt,但是要講錯誤輸出則用sort 2> name.txt,會把內容輸出到name.txt。如果要同時將標準輸出和標準錯誤輸出都輸出,則需要sort > name.txt 2>& 1,或者使用sort >& name.txt。

11) .

讀取並執行.sh文件,且是在當前shell下執行(./xxx.sh是在子shell下執行)

5、$

1)$$ 當前Shell進程的ID

2)$0 當前腳本的文件名

3)$n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。最多到9,第十個無法用$10獲取,需要存儲$1以後,用shift命令把第一個變量剔除,則此時$9就是輸入的第十個變量。

4)$# 傳遞給腳本或函數的參數個數。

5)$* 傳遞給腳本或函數的所有參數。

6)$@ 傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同。"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。

7)$? 上個命令的退出狀態,或函數的返回值。

6、判斷

執行man test可以查看所有測試表達式可以比較和判斷的類型。

-e 文件已經存在

-f 文件是普通文件

-s 文件大小不為零

-d 文件是一個目錄

-r 文件對當前用戶可以讀取

-w 文件對當前用戶可以寫入

-x 文件對當前用戶可以執行

-g 文件的 GID 標誌被設置

-u 文件的 UID 標誌被設置

-O 文件是屬於當前用戶的

-G 文件的組 ID 和當前用戶相同

file1 -nt file2 文件 file1 比 file2 更新

file1 -ot file2 文件 file1 比 file2 更老

file1 -ef file2 文件 file1 是 file2 的硬鏈接

如 if [ -x /root ] 可以用於判斷 /root 目錄是否可以被當前用戶進入

對應的操作 整數操作 字符串操作

相同 -eq =

不同 -ne !=

大於 -gt >

小於 -lt <

大於或等於 -ge

小於或等於 -le

為空 -z

不為空 -n ,建議使用 ! -z 代替

上次讀過之後做過修改 -N

比如:

比較整數 a 和 b 是否相等就寫做 if [ $a = $b ]

判斷整數 a 是否大於整數 b 就寫做 if [ $a -gt $b ]

比較字符串 a 和 b 是否相等就寫作:if [ $a = $b ]

判斷字符串 a 是否為空就寫作: if [ -z $a ]

判斷整數變量 a 是否大於 b 就寫作:if [ $a -gt $b ]

註意:在“[”和“]”符號的左右都留有空格。

7、調試

sh -n your_script 不需要執行腳本只是檢查語法的模式,返回所有語法錯誤。

sh -x strangescript 執行該腳本並顯示所有變量的值。

8、[[]]與[]區別

1)數字測試: -eq -ne -lt -le -gt -ge,[[ ]]同 [ ]一致
2)文件測試: -r、-l、-w、-x、-f、-d、-s、-nt、-ot,[[ ]]同 [ ]一致
3)字符串測試: > < =(同==) != -n -z,不可使用“<=”和“>=”,[[ ]]同 [ ]一致,但在[]中,>和<必須使用\進行轉義,即\>和\<
4)邏輯測試: []為 -a -o ! [[ ]] 為&& || !
5)數學運算: [] 不可以使用 [[ ]]可以使用+ - * / %
6)組合: 均可用各自邏輯符號連接的數字(運算)測試、文件測試、字符測試

兩個使用時都需要用空格分隔運算符和值。

9、(())

專門來做數值運算,如果表達式求值為 0,則設置退出狀態為 1;如果求值為非 0 值,則設置為 0。不需要對 (( 和 )) 之間的操作符轉義。算術只對整數進行。除 0 會產生錯誤,但不會產生溢出。可以執行 C 語言中常見的算術、邏輯和位操作。

下面兩種方法都輸出100:

((i=1+99));echo $i

i=99;((i++));echo $i

這種方法下符號和值不要有空格,和[[]]不一樣。

10、&

命令末尾的&,表示采用非阻塞的方式執行命令,即不必等待執行結果,可以一邊執行該行命令一邊往下執行。

11、函數

求函數的定義必須在函數使用之前。

函數參數的定義並不需要在函數定義處就制定,而只需要在函數被調用時用 BASH 的保留變量 $1 $2 ... 來引用就可以了。

BASH 的返回值可以用 return 語句來指定返回一個特定的整數,如果沒有 return 語句顯式的返回一個返回值,則返回值就是該函數最後一條語句執行的結果(一般為 0,如果執行失敗返回錯誤碼)。BASH 要求返回值必須為一個整數,不能用 return 語句返回字符串變量。

函數的返回值在調用該函數的程序體中通過 $? 保留字來獲得。

例如:

square() {

let "res = $1 * $1"

return $res

}

square $1

result=$?

12、select

BASH 中提供了一個小的語句格式,可以讓程序快速的設計出一個字符界面的用戶交互選擇的菜單,該功能就是由 select 語句來實現的,select 語句的語法為:

xxx=’a b c’

select var in $xxx

do

statments use $var

done

上面的語法結構在執行後,BASH 會將$xxx中的所有項加上數字列在屏幕上等待用戶選擇,在用戶作出選擇後,變量 $var 中就包含了那個被選中的字符串,然後就可以對該變量進行需要的操作了。

13、read

等待用戶的輸入,並將用戶輸入的結果作為變量。

read NAME

echo "Hi! $NAME !"

——written by linhxx

更多最新文章,歡迎關註微信公眾號“決勝機器學習”,或掃描右邊二維碼。技術分享圖片

Linux學習閑談(一)——Shell基本操作與命令