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