Linux入門學習筆記(五)--Shell指令碼編寫
Shell指令碼的HelloWorld: cd /自己的路徑下 vi helloworld.sh 進入之後,預設是命令狀態,按i進入編輯模式 內容: #! /bin/bash echo "Hello World!" 按ESC,輸入:wq回車 chmod +x helloworld.sh ./helloworld.sh 在命令視窗輸出了:Hello World!
shell的知識點小記: 描述的有點兒不容易懂,看了好久才勉強明白 # ## % %%。 #、## 表示從左邊開始刪除。一個 # 表示從左邊刪除到第一個指定的字元;兩個 # 表示從左邊刪除到最後一個指定的字元。 %、%% 表示從右邊開始刪除。一個 % 表示從右邊刪除到第一個指定的字元;兩個 % 表示從左邊刪除到最後一個指定的字元。 刪除包括了指定的字元本身。
shell陣列操作小記: 看陣列的時候,覺得遍歷陣列用的比較多,所以自己試著寫了寫遍歷,同時試了一下在SHELL指令碼中的變數自增幾個寫法,在就新手學習的時候注意一下 [ 和 $ 之間要有空格,沒有空格執行會報錯,新手可能不太注意這一點,我開始就沒注意到~~~~ 示例如下: #!/bin/bash my_arry=(a b "c","d" abc) echo "-------FOR迴圈遍歷輸出陣列--------" for i in ${my_arry[@]}; do echo $i done
echo "-------::::WHILE迴圈輸出 使用 let i++ 自增:::::---------" j=0 while [ $j -lt ${#my_arry[@]} ] do echo ${my_arry[$j]} let j++ done
echo "--------:::WHILE迴圈輸出 使用 let "n++ "自增: 多了雙引號,其實不用也可以:::---------" n=0 while [ $n -lt ${#my_arry[@]} ] do echo ${my_arry[$n]} let "n++" done
echo "---------::::WHILE迴圈輸出 使用 let m+=1 自增,這種寫法其他程式設計中也常用::::----------" m=0 while [ $m -lt ${#my_arry[@]} ] do echo ${my_arry[$m]} let m+=1 done
echo "-------::WHILE迴圈輸出 使用 a=$[$a+1] 自增,個人覺得這種寫法比較麻煩::::----------" a=0 while [ $a -lt ${#my_arry[@]} ] do echo ${my_arry[$a]} a=$[$a+1] done shell運算子注意事項: ①.使用 [[ ... ]] 條件判斷結構,而不是 [ ... ],能夠防止指令碼中的許多邏輯錯誤。比如,&&、||、< 和 > 操作符能夠正常存在於 [[ ]] 條件判斷結構中,但是如果出現在 [ ] 結構中的話,會報錯。 ②.字串比較是否為 null 這裡: #!/bin/bash a="" if [ -n $a ] then echo "-n $a : 字串長度不為 0" else echo "-n $a : 字串長度為 0" fi
輸出結果為:
-n : 字串長度不為 0
從結果上看 -n $a 返回 true,這並正確,正確的做法是 $a 這裡應該加上雙引號,否則 -n $a 的結果永遠是 true:
#!/bin/bash a="" if [ -n "$a" ] then echo "-n $a : 字串長度不為 0" else echo "-n $a : 字串長度為 0" fi
輸出結果為: -n : 字串長度為 0 ③.推薦用 $() 代替 ``: val=`expr 10 + 20` val=$(expr 10 + 20) shell printf命令: printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 解釋: %-10s 指一個寬度為10個字元(-表示左對齊,沒有則表示右對齊),任何字元都會被顯示在10個字元寬的字元內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。%-4.2f 指格式化為小數,其中.2指保留2位小數。 ①.如果沒有 arguments,那麼 %s 用NULL代替,%d 用 0 代替,printf "%s and %d \n" ,輸出: and 0 ②.格式只指定了一個引數,但多出的引數仍然會按照該格式輸出,format-string 被重用 shell test命令: -eq 等於為真 -ne 不等於為真 -gt 大於為真 -ge 大於等於為真 -lt 小於為真 -le 小於等於為真 例: num1=100 num2=100 if test $[num1] -eq $[num2] then echo '兩個數相等!' else echo '兩個數不相等!' fi
shell 傳參示例: #! /bin/bash read -p "請輸入變數a的值:" a read -p "請輸入變數b的值:" b result=$[a+b] echo '相加結果為:'$result 示例二: #! /bin/bash echo "Shell 傳遞引數!" echo "執行的檔名為:$0" echo "傳入的第一個引數為$1" echo "傳入的第二個引數為$2" echo "傳入的第三個引數為$3" read -p "按任意鍵退出..."
shell 檔案測試:☆ 引數 說明 -e 檔名 如果檔案存在則為真 -r 檔名 如果檔案存在且可讀則為真 -w 檔名 如果檔案存在且可寫則為真 -x 檔名 如果檔案存在且可執行則為真 -s 檔名 如果檔案存在且至少有一個字元則為真 -d 檔名 如果檔案存在且為目錄則為真 -f 檔名 如果檔案存在且為普通檔案則為真 -c 檔名 如果檔案存在且為字元型特殊檔案則為真 -b 檔名 如果檔案存在且為塊特殊檔案則為真 例項演示: cd /bin if test -e ./bash then echo '檔案已存在!' else echo '檔案不存在!' fi 另外,Shell還提供了與( -a )、或( -o )、非( ! )三個邏輯操作符用於將測試條件連線起來,其優先順序為:"!"最高,"-a"次之,"-o"最低。例如: cd /bin if test -e ./notFile -o -e ./bash then echo '至少有一個檔案存在!' else echo '兩個檔案都不存在' fi linux shell 檔案包含 Shell 也可以包含外部指令碼。這樣可以很方便的封裝一些公用的程式碼作為一個獨立的檔案。 Shell 檔案包含的語法格式如下: . filename # 注意點號(.)和檔名中間有一空格 或 source filename 示例: test1.sh #! /bin/bash url=www.baidu.com test2.sh #! /bin/bash . ./test1.sh echo "百度網址:${url}" ./test2.sh 輸出: 百度網址:www.baidu.com