菜鳥教程之Shell 腳本學習筆記(二)

Shell 傳遞參數

  • $# :傳遞到腳本的參數個數;
  • $0: 執行的文件名;
  • $nn 代表一個數字,1 爲執行腳本的第一個參數,2 爲執行腳本的第二個參數,以此類推……
  • $*:以一個單字符串顯示所有向腳本傳遞的參數;
  • $@:與$*相同,但是使用時加引號,並在引號中返回每個參數。
  • $$:腳本運行的當前進程ID號;
  • $!:後臺運行的最後一個進程的ID號;
  • $?:顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤;
  • $-:顯示Shell使用的當前選項,與set命令功能相同;

Shell 運算符:

1. 表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2;

2. 完整的表達式要被 ` ` 包含,例如:val=`expr 2 + 2`;

3. 乘法:`expr $a \* $b` ,乘號(*)前邊必須加反斜槓(\)才能實現乘法運算;

Shell關係運算符:關係運算符只支持數字,不支持字符串,除非字符串的值是數字,例如a=10,b=20;

  • -eq:檢測兩個數是否相等,相等返回 true,[ $a -eq $b ] 返回 false;
  • -ne:檢測兩個數是否不相等,不相等返回 true,[ $a -ne $b ] 返回 true;
  • -gt:檢測左邊的數是否大於右邊的,如果是,則返回 true,[ $a -gt $b ] 返回 false;
  • -lt:檢測左邊的數是否小於右邊的,如果是,則返回 true,[ $a -lt $b ] 返回 true;
  • -ge:檢測左邊的數是否大於等於右邊的,如果是,則返回 true,[ $a -ge $b ] 返回 false;
  • -le:檢測左邊的數是否小於等於右邊的,如果是,則返回 true,[ $a -le $b ] 返回 true;
  • ==:相等。用於比較兩個數字,相同則返回 true,[ $a == $b ] 返回 false;
  • !=:不相等。用於比較兩個數字,不相同則返回 true,[ $a != $b ] 返回 true;
  • > 和 < 進行比較時,需要使用[[ ... ]] 條件判斷結構;

Shell布爾、邏輯運算符:假定變量 a 爲 10,變量 b 爲 20:

  • !:非運算,表達式爲 true 則返回 false,否則返回 true,[ ! false ] 返回 true;
  • -o:或運算,有一個表達式爲 true 則返回 true,[ $a -lt 20 -o $b -gt 100 ] 返回 true;
  • -a:與運算,兩個表達式都爲 true 才返回 true,[ $a -lt 20 -a $b -gt 100 ] 返回 false;
  • &&:邏輯的 AND,[[ $a -lt 100 && $b -gt 100 ]] 返回 false;
  • ||:邏輯的 OR,[[ $a -lt 100 || $b -gt 100 ]] 返回 true;

注:[]等價於test命令;

Shell字符串獨有運算符:

  • -z:檢測字符串長度是否爲0,爲0返回 true;
  • -n:檢測字符串長度是否爲0,不爲0返回 true;
  • $:檢測字符串是否爲空,不爲空返回 true;

文件測試運算符:

操作符 說明 舉例
-b file 檢測文件是否是塊設備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測文件是否是字符設備文件,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測文件是否設置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測文件是否設置了粘着位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
-p file 檢測文件是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測文件是否設置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file 檢測文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file 檢測文件是否可執行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測文件是否爲空(文件大小是否大於0),不爲空返回 true。 [ -s $file ] 返回 true。
-e file 檢測文件(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。

Shell printf 命令:printf  format-string  [arguments...]

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com
 
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543 
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 

執行腳本,輸出結果如下所示:
姓名     性別   體重kg
郭靖     男      66.12
楊過     男      48.65
郭芙     女      47.99

%s %c %d %f都是格式替代符
%-10s 指一個寬度爲10個字符(-表示左對齊,沒有則表示右對齊),
任何字符都會被顯示在10個字符寬的字符內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。
%-4.2f 指格式化爲小數,其中.2指保留2位小數。

printf的轉義序列

序列 說明
\a 警告字符,通常爲ASCII的BEL字符
\b 後退
\c 抑制(不顯示)輸出結果中任何結尾的換行字符(只在%b格式指示符控制下的參數字符串中有效),而且,任何留在參數裏的字符、任何接下來的參數以及任何留在格式字符串中的字符,都被忽略
\f 換頁(formfeed)
\n 換行
\r 回車(Carriage return)
\t 水平製表符
\v 垂直製表符
\\ 一個字面上的反斜槓字符
\ddd 表示1到3位數八進制值的字符。僅在格式字符串中有效
\0ddd 表示1到3位的八進制值字符

for 循環:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
寫成一行: 
for var in item1 item2 ... itemN; do command1; command2… done;

while 語句:

while condition
do
    command
done

例如:
#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done
運行腳本,輸出: 
1
2
3
4
5

使用中使用了 Bash let 命令,它用於執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量;

無限循環 :

while :
do
    command
done
或者 
while true
do
    command
done
或者 
for (( ; ; ))

until 循環:

until 循環執行一系列命令直至條件爲 true 時停止。

until 循環與 while 循環在處理方式上剛好相反。

一般 while 循環優於 until 循環,但在某些時候—也只是極少數情況下,until 循環更加有用。

until 語法格式:
until condition
do
    command
done
condition 一般爲條件表達式,如果返回值爲 false,則繼續執行循環體內的語句,否則跳出循環。
以下實例我們使用 until 命令來輸出 0 ~ 9 的數字:
#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done
運行結果:
輸出結果爲:
0
1
2
3
4
5
6
7
8
9

case:Shell case語句爲多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

case工作方式如上所示。取值後面必須爲單詞in,每一模式必須以右括號結束。取值可以爲變量或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;;。

取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令後不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行後面的命令。

Shell函數:

[ function ] funname [()]

{
    action;

    [return int;]
}

說明:

  • 1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。
  • 2、參數返回,可以顯示加:return 返回,如果不加,將以最後一條命令運行結果,作爲返回值。 return後跟數值n(0-255
下面的例子定義了一個函數並進行調用: 
#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

demoFun(){
    echo "這是我的第一個 shell 函數!"
}
echo "-----函數開始執行-----"
demoFun
echo "-----函數執行完畢-----"
輸出結果: 
-----函數開始執行-----
這是我的第一個 shell 函數!
-----函數執行完畢-----

下面定義一個帶有return語句的函數:

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

funWithReturn(){
    echo "這個函數會對輸入的兩個數字進行相加運算..."
    echo "輸入第一個數字: "
    read aNum
    echo "輸入第二個數字: "
    read anotherNum
    echo "兩個數字分別爲 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個數字之和爲 $? !"
輸出類似下面: 
這個函數會對輸入的兩個數字進行相加運算...
輸入第一個數字: 
1
輸入第二個數字: 
2
兩個數字分別爲 1 和 2 !
輸入的兩個數字之和爲 3 !

函數返回值在調用該函數後通過 $? 來獲得。

注意:所有函數在使用前必須定義。這意味着必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,纔可以使用。調用函數僅使用其函數名即可。

cat相關:

cat << EOF >> config.h表示以下內容追加到config.h中,直到出現EOF標記爲止,例如:

cat << EOF >> config.h
#include <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/${CONFIG_NAME}.h>
#include <asm/config.h>
#include <config_fallbacks.h>
#include <config_uncmd_spl.h>
EOF

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章