Shell 傳遞參數
- $# :傳遞到腳本的參數個數;
- $0: 執行的文件名;
- $n:n 代表一個數字,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