日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

SH脚本学习总结

發(fā)布時(shí)間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SH脚本学习总结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ì)把Goldbergphonebook當(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ò)展:

1echo -e "\n"?等同于echo $'\n'?????????#?新行

2ssh 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還是falsetrue時(shí)候,在執(zhí)行里面的語(yǔ)句。

???? 實(shí)例:

??

7.3 until循環(huán)

??? 語(yǔ)法:until? [表達(dá)式]

???????????????? do

???????????????? 操作......

???????????????? done

????

?? 說(shuō)明: untilwhile正好相反, until是如果表達(dá)式不成立則執(zhí)行里面的操作,直到表達(dá)式成功后結(jié)束。

?? 實(shí)例:

?

轉(zhuǎn)載于:https://blog.51cto.com/4443915/1788658

總結(jié)

以上是生活随笔為你收集整理的SH脚本学习总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。