SH脚本学习总结
1、腳本開頭
??????????????? #!/bin/bash或者#!/bin/sh
二者區(qū)別
sh:Bourne shell(sh) 是 UNIX 最初使用的shell,并且在每種 UNIX 上都可以使用, 在 shell 編程方面相當(dāng)優(yōu)秀,但在處理與用戶的交互方面做得不如其他幾種shell。
bash: Linux 操作系統(tǒng)缺省的 shell 是Bourne Again shell,它是 Bourne shell 的擴(kuò)展,簡稱 Bash,與 Bourne shell 完全向后兼容,并且在Bourneshell 的基礎(chǔ)上增加、增強(qiáng)了很多特性。Bash放在/bin/bash中,它有許多特色,可以提供如命令補(bǔ)全、命令編輯和命令歷史表等功能,它還包含了很多 C shell 和 Korn shell 中的優(yōu)點(diǎn),有靈活和強(qiáng)大的編程接口,同時又有很友好的用戶界面。
2、注釋
?? 2.1 #單行注釋
?? 2.2多行注釋
????? 方法A:
? ? ? ?
? ? ? ?如果注釋中有反引號的命令就會報錯,反引號部分不會被注釋掉,例如 var=`ls -l` 就不會被注釋掉。? ? ? ?
? ? ? ?方法B(避免反引號報錯):
? ? ? ?
3、變量定義
3.1直接定義
??? java_home="/opt/Oracle/java"
3.2 變量傳遞
??? java_bin=$java_home/bin或者java_bin=${java_home}/bin
3.3 參數(shù)傳遞
??version=$1
?????? 說明:$0代表sh運(yùn)行命令的第一個參數(shù),即該sh文件的全名
???????????? $1代表sh運(yùn)行命令的第二個參數(shù)
變量說明
$$ Shell本身的PID(ProcessID)
$! Shell最后運(yùn)行的后臺Process的PID
$? 最后運(yùn)行的命令的結(jié)束代碼(返回值)
$- 使用Set命令設(shè)定的Flag一覽
$* 所有參數(shù)列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數(shù)。
$@ 所有參數(shù)列表。如"$@"用「"」括起來的情況、以"$1" "$2" …"$n" 的形式輸出所有參數(shù)。
$# 添加到Shell的參數(shù)個數(shù)
$0 Shell本身的文件名
$1~$n添加到Shell的各參數(shù)值。$1是第1參數(shù)、$2是第2參數(shù)…。
舉例:
sh test.sh aabb
echo"number:$#"?? #輸出number:2
echo "scname:$0" #輸出scname:test.sh
echo "first :$1"? #輸出first:aa
echo "second:$2"? #輸出second:bb
echo "argume:$@"? #輸出argume:aa bb
擴(kuò)展:
$*和$@的區(qū)別:
$*實(shí)例
$@實(shí)例
4、函數(shù)定義
??? 函數(shù)名(){
?????? 函數(shù)體
??? }
??? 舉例:
??? usage(){
??????? echo"usage:sh $0 pkg_version"
??????? echo"example:sh deploy_ciitc.sh V1.0.0B03_20160416_03-56-09"
??????? exit 1
??? }
??? 函數(shù)調(diào)用
??? 直接寫函數(shù)名,舉例:
??? if [ $# -ne 1];then
? ????usage
? ????exit 1
??? fi
5、單引號、雙引號、反引號與反斜杠
?? 5.1單引號 ('' )?
# grep Susan phonebook?
Susan Goldberg 403-212-4921?
Susan Topple 212-234-2343?
如果我們想查找的是Susan Goldberg,不能直接使用grep Susan Goldberg phonebook命令,grep會把Goldberg和phonebook當(dāng)作需要搜索的文件?
# grep 'Susan Gold' phonebook?
Susan Goldberg 403-212-4921?
當(dāng)shell碰到第一個單引號時,它忽略掉其后直到右引號的所有特殊字符?
5.2 雙引號 (" " )?
雙引號作用與單引號類似,區(qū)別在于它沒有那么嚴(yán)格。單引號告訴shell忽略所有特殊字符,而雙引號只要求忽略大多數(shù),具體說,括在雙引號中的三種特殊字符不被忽略:$,\,` ,即雙引號會解釋字符串的特別意思,而單引號直接使用字符串.如果使用雙引號將字符串賦給變量并反饋它,實(shí)際上與直接反饋?zhàn)兞坎o差別。如果要查詢包含空格的字符串,經(jīng)常會用到雙引號。?
# x=*?
# echo $x?
hello.sh menus.sh misc.sh phonebook tshift.sh?
# echo '$x'?
$x?
# echo "$x"?
*?
這個例子可以看出無引號、單引號和雙引號之間的區(qū)別。在最后一種情況中,雙引號告訴shell在引號內(nèi)照樣進(jìn)行變量名替換,所以shell把$x替換為*,因?yàn)殡p引號中不做文件名替換,所以就把*作為要顯示的值傳遞給echo。對于第一種情況需要進(jìn)一步說明,shell在給變量賦值時不進(jìn)行文件名替換(這從第三種情況中也能看出來),各步驟發(fā)生的精確次序如下: shell掃描命令行,把x的值設(shè)為星號*;?
shell再次掃描命令行,碰到星號*,把它替換成當(dāng)前目錄下的文件清單;?
shell啟動執(zhí)行echo命令,把文件清單作為參數(shù)傳遞給echo.?
這個賦值的先后次序非常重要:shell先作變量替換,然后作文件名替換,最后把這行處理為參數(shù)?
5.3 反引號(``)?
命令替換是指shell能夠?qū)⒁粋€命令的標(biāo)準(zhǔn)輸出插在一個命令行中任何位置。shell中有兩種方法作命令替換:把shell命令用反引號或者$(...)結(jié)構(gòu)括起來,其中,$(...)格式受到POSIX標(biāo)準(zhǔn)支持,也利于嵌套。?
# echo The date and time is `date`?
The date and time is 三 6月 1506:10:35 CST 2005?
# echo Your current working directory is $(pwd)?
Your current working directory is/home/howard/script?
5.4 反斜杠backslash-escaped( \ )?
反斜杠一般用作轉(zhuǎn)義字符,或稱逃脫字符,linux如果echo要讓轉(zhuǎn)義字符發(fā)生作用,就要使用-e選項(xiàng),且轉(zhuǎn)義字符要使用雙引號?
echo -e "\n"?
反斜杠的另一種作用,就是當(dāng)反斜杠用于一行的最后一個字符時,shell把行尾的反斜杠作為續(xù)行,這種結(jié)構(gòu)在分幾行輸入長命令時經(jīng)常使用。
?????? \n???表示新的一行
??? \r???表示回車
??? \t???表示水平制表符
??? \v???表示垂直制表符
??? \b???表示后退符
??? \a???表示"alert"(蜂鳴或者閃爍)
??? \0xx?轉(zhuǎn)換為八進(jìn)制的ASCII碼
擴(kuò)展:
1)echo -e "\n"?等同于echo $'\n'?????????#?新行
2)ssh root@172.20.11.13 'cd$batch_ws_pkg_path;[ -f $batch_ws_pkg ] && echo "batch ws? pkg find" || echo "batch ws? pkg not find" && exit 1 '
命令解釋:登錄172.20.11.13,并且在機(jī)器上執(zhí)行''內(nèi)部的命令-----切換目錄,成功后,判斷目錄如果存在,打印batch ws?pkg find否則打印batch ws?pkg not find并退出
?
6、邏輯判斷
6.1 IF語句
常用判斷:
擴(kuò)展:
6.2Case語句
case條件語句:
?? 語法: case 條件 in
????????? xxx)
????????? commands;;
????????? xxx)
????????? commands;;
????????? xxx)
????????? commands;;
????????? esac
?
?? 說明:這個esac 就是case的結(jié)束,想if...fi 一樣的,
???????? 注意commands;;中的“;;”不能少掉。
實(shí)例:
6、特殊簡寫命令
7循環(huán)
? 7.1 for循環(huán)
語法:for? 變量? in?? 列表
?????do
????????操作~~~~
????? done
??說明:變量是在當(dāng)前循環(huán)實(shí)用,用來替代當(dāng)前列表的對象。
?????列表:循環(huán)中所要操作的對象,可以是字符串,文件名等。
實(shí)例:
??
擴(kuò)展:for循環(huán)的其他寫法--注:對于固定次數(shù)的循環(huán),可以通過seq命令來實(shí)現(xiàn),就不需要變量的自增了;這里的C語言for循環(huán)風(fēng)格是挺熟悉的吧。
??
7.2 while循環(huán)
??? 語法: while? [ 表達(dá)式 ]
???????????????? do
???????????????? 操作......
?????????????? ??done
?
???? 說明:只要表達(dá)式成立,就將一直循環(huán)下去。
?????????? [] 和? 表達(dá)式?之間要有空格,最好在與操作符前后也加上空格
?????????? 先判斷表達(dá)式的true還是false,true時候,在執(zhí)行里面的語句。
???? 實(shí)例:
??
7.3 until循環(huán)
??? 語法:until? [表達(dá)式]
???????????????? do
???????????????? 操作......
???????????????? done
????
?? 說明: until和while正好相反, until是如果表達(dá)式不成立則執(zhí)行里面的操作,直到表達(dá)式成功后結(jié)束。
?? 實(shí)例:
?
轉(zhuǎn)載于:https://blog.51cto.com/4443915/1788658
總結(jié)
- 上一篇: 学习进度 09
- 下一篇: Lync登录错误解决一例