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 | morels -l | grep "myfile"
df -k | awk '' | grep -v "檔案系統"
df -k 檢視磁碟空間,找到第一列,去除「檔案系統」,並輸出
teetee命令把結果輸出到標準輸出,另乙個副本輸出到相應檔案。
df -k | awk '' | grep -v "檔案系統" | tee a.txttee -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或者 ...