Shell指令碼語法2

2021-08-10 19:07:19 字數 3408 閱讀 1294

break[n]可以指定跳出幾層迴圈,continue跳過本次迴圈步,沒跳出整個迴圈。

break跳出,continue跳過。

習題1、把上面驗證密碼的程式修改一下,如果使用者輸錯五次密碼就報錯退出。

有很多特殊變數是被shell自動賦值的,我們已經遇到了$?和$1,現在總結一下:

常用的位置引數和特殊變數

$0  相當於c語言main函式的argv[0]

$1、$2... 這些稱為位置引數(positional parameter),相當於c語言main函式的argv[1]、argv[2]...

$# 相當於c語言main函式的argc - 1,注意這裡的#後面不表示注釋

$@ 表示引數列表"$1" "$2" ...,例如可以用在for迴圈中的in後面。

$* 表示引數列表"$1" "$2" ...,同上

$? 上一條命令的exit status

$$ 當前程序號

位置引數可以用shift命令左移。比如shift 3表示原來的$4現在變成$1,原來的$5現在變成$2等等,原來的$1、$2、$3丟棄,$0不移動。不帶引數的shift命令相當於shift 1。例如:

#! /bin/sh

echo "the program $0 is now running"

echo "the first parameter is $1"

echo "the second parameter is $2"

echo "the parameter list is $@"

shift

echo "the first parameter is $1"

echo "the second parameter is $2"

echo "the parameter list is $@"

echo

echo顯示文字行或變數,或者把字串輸入到檔案。

echo [option] string

-e 解析轉義字元

-n 不回車換行。預設情況echo回顯的內容後面跟乙個回車換行。

echo "hello\n\n"

echo -e "hello\n\n"

echo "hello"

echo -n "hello"

管道|可以通過管道把乙個命令的輸出傳遞給另乙個命令做輸入。管道用豎線表示。

cat myfile | more

ls -l | grep "myfile"

df -k | awk '' | grep -v "檔案系統"

df -k 檢視磁碟空間,找到第一列,去除「檔案系統」,並輸出

teetee命令把結果輸出到標準輸出,另乙個副本輸出到相應檔案。

df -k | awk '' | grep -v "檔案系統" | tee a.txt

tee -a a.txt表示追加操作。

df -k | awk '' | grep -v "檔案系統" | tee -a a.txt

檔案重定向

cmd > file             把標準輸出重定向到新檔案中

cmd >> file 追加

cmd > file 2>&1 標準出錯也重定向到1所指向的file裡

cmd >> file 2>&1

cmd < file1 > file2 輸入輸出都定向到檔案裡

cmd < &fd 把檔案描述符fd作為標準輸入

cmd > &fd 把檔案描述符fd作為標準輸出

cmd < &- 關閉標準輸入

和c語言類似,shell中也有函式的概念,但是函式定義中沒有返回值也沒有引數列表。例如:

#! /bin/sh

foo()

echo "-=start=-"

fooecho "-=end=-"

注意函式體的左花括號''寫在同一行,命令末尾必須有;號。

在定義foo()函式時並不執行函式體中的命令,就像定義變數一樣,只是給foo這個名字乙個定義,到後面呼叫foo函式的時候(注意shell中的函式呼叫不寫括號)才執行函式體中的命令。shell指令碼中的函式必須先定義後呼叫,一般把函式定義都寫在指令碼的前面,把函式呼叫和其它命令寫在指令碼的最後(類似c語言中的main函式,這才是整個指令碼實際開始執行命令的地方)。

shell函式沒有引數列表並不表示不能傳引數,事實上,函式就像是迷你指令碼,呼叫函式時可以傳任意個引數,在函式內同樣是用$0、$1、$2等變數來提取引數,函式中的位置引數相當於函式的區域性變數,改變這些變數並不會影響函式外面的$0、$1、$2等變數。函式中可以用return命令返回,如果return後面跟乙個數字則表示函式的exit status。

下面這個指令碼可以一次建立多個目錄,各目錄名通過命令列引數傳入,指令碼逐個測試各目錄是否存在,如果目錄不存在,首先列印資訊然後試著建立該目錄。

#! /bin/sh

is_directory()

for dir in "$@"; do

if is_directory "$dir"

then :

else

echo "$dir doesn't exist. creating it now..."

mkdir $dir > /dev/null 2>&1

if [ $? -ne 0 ]; then

echo "cannot create directory $dir"

exit 1

fifi

done

注意is_directory()返回0表示真返回1表示假。

shell提供了一些用於除錯指令碼的選項,如下所示:

-n讀一遍指令碼中的命令但不執行,用於檢查指令碼中的語法錯誤

-v一邊執行指令碼,一邊將執行過的指令碼命令列印到標準錯誤輸出

-x提供跟蹤執行資訊,將執行的每一條命令和結果依次列印出來

使用這些選項有三種方法,一是在命令列提供引數

$ sh -x ./script.sh

二是在指令碼開頭提供引數

#! /bin/sh -x

第三種方法是在指令碼中用set命令啟用或禁用引數

#! /bin/sh

if [ -z "$1" ]; then

set -x

echo "error: insufficient args."

exit 1

set +x

fi

set -x和set +x分別表示啟用和禁用-x引數,這樣可以只對指令碼中的某一段進行跟蹤除錯。

Shell指令碼語法

定義單變數 p name kang 使用單變數 echo p name js 輸出kang.js echo p name.js 輸出kang.js cp p name.js copy.js 命令1 命令2 如果左邊的 命令1 執行成功,那麼右邊的 命令2 才會被執行。命令1 命令2 與 相反。如果 ...

shell指令碼 語法

條件測試 test 命令test 可以測試乙個條件是否成立,如果測試條件為真,則該命令的exitstatus為0,反之,exitstatus為1。注意 命令 各引數之間應該用空格隔開,以 結尾。但是 不是命令。測試命令 d dir 如果dir存在並且是乙個目錄則為真 f file 如果file存在並...

shell指令碼語法

測試乙個條件是否成立,python ubuntu 1004 var 2 python ubuntu 1004 test var python ubuntu 1004 echo 0python ubuntu 1004 test var gt 5 python ubuntu 1004 echo 1或者 ...