菜鸟教程之Shell 脚本学习笔记(二)
Shell 傳遞參數(shù)
- $# :傳遞到腳本的參數(shù)個數(shù);
- $0:?執(zhí)行的文件名;
- $n:n 代表一個數(shù)字,1 為執(zhí)行腳本的第一個參數(shù),2 為執(zhí)行腳本的第二個參數(shù),以此類推……
- $*:以一個單字符串顯示所有向腳本傳遞的參數(shù);
- $@:與$*相同,但是使用時加引號,并在引號中返回每個參數(shù)。
- $$:腳本運行的當前進程ID號;
- $!:后臺運行的最后一個進程的ID號;
- $?:顯示最后命令的退出狀態(tài)。0表示沒有錯誤,其他任何值表明有錯誤;
- $-:顯示Shell使用的當前選項,與set命令功能相同;
Shell 運算符:
1.?表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2;
2.?完整的表達式要被 ` ` 包含,例如:val=`expr 2 + 2`;
3.?乘法:`expr $a \* $b` ,乘號(*)前邊必須加反斜杠(\)才能實現(xiàn)乘法運算;
Shell關(guān)系運算符:關(guān)系運算符只支持數(shù)字,不支持字符串,除非字符串的值是數(shù)字,例如a=10,b=20;
- -eq:檢測兩個數(shù)是否相等,相等返回 true,[ $a -eq $b ] 返回?false;
- -ne:檢測兩個數(shù)是否不相等,不相等返回 true,[ $a -ne $b ] 返回 true;
- -gt:檢測左邊的數(shù)是否大于右邊的,如果是,則返回 true,[ $a -gt $b ] 返回 false;
- -lt:檢測左邊的數(shù)是否小于右邊的,如果是,則返回 true,[ $a -lt $b ] 返回 true;
- -ge:檢測左邊的數(shù)是否大于等于右邊的,如果是,則返回 true,[ $a -ge $b ] 返回 false;
- -le:檢測左邊的數(shù)是否小于等于右邊的,如果是,則返回 true,[ $a -le $b ] 返回 true;
- ==:相等。用于比較兩個數(shù)字,相同則返回 true,[ $a == $b ] 返回?false;
- !=:不相等。用于比較兩個數(shù)字,不相同則返回 true,[ $a != $b ] 返回 true;
- > 和 < 進行比較時,需要使用[[ ... ]] 條件判斷結(jié)構(gòu);
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 | 檢測文件是否是塊設(shè)備文件,如果是,則返回 true。 | [ -b $file ] 返回 false。 |
| -c file | 檢測文件是否是字符設(shè)備文件,如果是,則返回 true。 | [ -c $file ] 返回?false。 |
| -d file | 檢測文件是否是目錄,如果是,則返回 true。 | [ -d $file ] 返回 false。 |
| -f file | 檢測文件是否是普通文件(既不是目錄,也不是設(shè)備文件),如果是,則返回 true。 | [ -f $file ] 返回?true。 |
| -g file | 檢測文件是否設(shè)置了 SGID 位,如果是,則返回 true。 | [ -g $file ] 返回?false。 |
| -k file | 檢測文件是否設(shè)置了粘著位(Sticky Bit),如果是,則返回 true。 | [ -k $file ] 返回?false。 |
| -p file | 檢測文件是否是有名管道,如果是,則返回 true。 | [ -p $file ] 返回?false。 |
| -u file | 檢測文件是否設(shè)置了 SUID 位,如果是,則返回 true。 | [ -u $file ] 返回?false。 |
| -r file | 檢測文件是否可讀,如果是,則返回 true。 | [ -r $file ] 返回?true。 |
| -w file | 檢測文件是否可寫,如果是,則返回 true。 | [ -w $file ] 返回?true。 |
| -x file | 檢測文件是否可執(zhí)行,如果是,則返回 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.comprintf "%-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 執(zhí)行腳本,輸出結(jié)果如下所示: 姓名 性別 體重kg 郭靖 男 66.12 楊過 男 48.65 郭芙 女 47.99%s %c %d %f都是格式替代符 %-10s 指一個寬度為10個字符(-表示左對齊,沒有則表示右對齊), 任何字符都會被顯示在10個字符寬的字符內(nèi),如果不足則自動以空格填充,超過也會將內(nèi)容全部顯示出來。 %-4.2f 指格式化為小數(shù),其中.2指保留2位小數(shù)。printf的轉(zhuǎn)義序列
| \a | 警告字符,通常為ASCII的BEL字符 |
| \b | 后退 |
| \c | 抑制(不顯示)輸出結(jié)果中任何結(jié)尾的換行字符(只在%b格式指示符控制下的參數(shù)字符串中有效),而且,任何留在參數(shù)里的字符、任何接下來的參數(shù)以及任何留在格式字符串中的字符,都被忽略 |
| \f | 換頁(formfeed) |
| \n | 換行 |
| \r | 回車(Carriage return) |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \\ | 一個字面上的反斜杠字符 |
| \ddd | 表示1到3位數(shù)八進制值的字符。僅在格式字符串中有效 |
| \0ddd | 表示1到3位的八進制值字符 |
for 循環(huán):
for var in item1 item2 ... itemN docommand1command2...commandN done 寫成一行: for var in item1 item2 ... itemN; do command1; command2… done;while 語句:
while condition docommand done例如: #!/bin/bash int=1 while(( $int<=5 )) doecho $intlet "int++" done 運行腳本,輸出: 1 2 3 4 5使用中使用了 Bash let 命令,它用于執(zhí)行一個或多個表達式,變量計算中不需要加上 $ 來表示變量;
無限循環(huán) :
while : docommand done 或者 while true docommand done 或者 for (( ; ; ))until 循環(huán):
until 循環(huán)執(zhí)行一系列命令直至條件為 true 時停止。
until 循環(huán)與 while 循環(huán)在處理方式上剛好相反。
一般 while 循環(huán)優(yōu)于 until 循環(huán),但在某些時候—也只是極少數(shù)情況下,until 循環(huán)更加有用。
until 語法格式: until condition docommand done condition 一般為條件表達式,如果返回值為 false,則繼續(xù)執(zhí)行循環(huán)體內(nèi)的語句,否則跳出循環(huán)。 以下實例我們使用 until 命令來輸出 0 ~ 9 的數(shù)字: #!/bin/basha=0until [ ! $a -lt 10 ] doecho $aa=`expr $a + 1` done 運行結(jié)果: 輸出結(jié)果為: 0 1 2 3 4 5 6 7 8 9case:Shell case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執(zhí)行相匹配的命令。
case 值 in 模式1)command1command2...commandN;; 模式2)command1command2...commandN;; esaccase工作方式如上所示。取值后面必須為單詞in,每一模式必須以右括號結(jié)束。取值可以為變量或常數(shù)。匹配發(fā)現(xiàn)取值符合某一模式后,其間所有命令開始執(zhí)行直至 ;;。
取值將檢測匹配的每一個模式。一旦模式匹配,則執(zhí)行完匹配模式相應命令后不再繼續(xù)其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執(zhí)行后面的命令。
Shell函數(shù):
[ function ] funname [()]{action;[return int;] }說明:
- 1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數(shù)。
- 2、參數(shù)返回,可以顯示加:return 返回,如果不加,將以最后一條命令運行結(jié)果,作為返回值。 return后跟數(shù)值n(0-255
下面定義一個帶有return語句的函數(shù):
#!/bin/bash # author:菜鳥教程 # url:www.runoob.comfunWithReturn(){echo "這個函數(shù)會對輸入的兩個數(shù)字進行相加運算..."echo "輸入第一個數(shù)字: "read aNumecho "輸入第二個數(shù)字: "read anotherNumecho "兩個數(shù)字分別為 $aNum 和 $anotherNum !"return $(($aNum+$anotherNum)) } funWithReturn echo "輸入的兩個數(shù)字之和為 $? !" 輸出類似下面: 這個函數(shù)會對輸入的兩個數(shù)字進行相加運算... 輸入第一個數(shù)字: 1 輸入第二個數(shù)字: 2 兩個數(shù)字分別為 1 和 2 ! 輸入的兩個數(shù)字之和為 3 !函數(shù)返回值在調(diào)用該函數(shù)后通過 $? 來獲得。
注意:所有函數(shù)在使用前必須定義。這意味著必須將函數(shù)放在腳本開始部分,直至shell解釋器首次發(fā)現(xiàn)它時,才可以使用。調(diào)用函數(shù)僅使用其函數(shù)名即可。
cat相關(guān):
cat << EOF >> config.h表示以下內(nèi)容追加到config.h中,直到出現(xiàn)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
總結(jié)
以上是生活随笔為你收集整理的菜鸟教程之Shell 脚本学习笔记(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 菜鸟教程 之 shell 脚本学习笔记
- 下一篇: SMP多核启动