最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇教會(huì)你寫(xiě)90%的shell腳本(入門(mén)小結(jié))

 更新時(shí)間:2020年05月11日 11:06:08   作者:web洋仔  
這篇文章主要介紹了一篇教會(huì)你寫(xiě)90%的shell腳本,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

shell腳本?

在說(shuō)什么是shell腳本之前,先說(shuō)說(shuō)什么是shell。

shell是外殼的意思,就是操作系統(tǒng)的外殼。我們可以通過(guò)shell命令來(lái)操作和控制操作系統(tǒng),比如Linux中的Shell命令就包括ls、cd、pwd等等??偨Y(jié)來(lái)說(shuō),Shell是一個(gè)命令解釋器,它通過(guò)接受用戶輸入的Shell命令來(lái)啟動(dòng)、暫停、停止程序的運(yùn)行或?qū)τ?jì)算機(jī)進(jìn)行控制。

shell 是一個(gè)應(yīng)用程序,它連接了用戶和 Linux 內(nèi)核,讓用戶能夠更加高效、安全、低成本地使用 Linux 內(nèi)核,這就是 Shell 的本質(zhì)。

shell 本身并不是內(nèi)核的一部分,它只是站在內(nèi)核的基礎(chǔ)上編寫(xiě)的一個(gè)應(yīng)用程序。

那么什么是shell腳本呢?

shell腳本就是由Shell命令組成的執(zhí)行文件,將一些命令整合到一個(gè)文件中,進(jìn)行處理業(yè)務(wù)邏輯,腳本不用編譯即可運(yùn)行。它通過(guò)解釋器解釋運(yùn)行,所以速度相對(duì)來(lái)說(shuō)比較慢。

shell腳本中最重要的就是對(duì)shell命令的使用與組合,再使用shell腳本支持的一些語(yǔ)言特性,完成想要的功能。

 注釋

“# ”開(kāi)頭的就是注釋,被編譯器忽略

  • 單行注釋: #
  • 多行注釋: :<<EOF … EOF 或者 :<<! … ! (:<< 標(biāo)識(shí)多行注釋開(kāi)始,并指定一個(gè)標(biāo)識(shí)符作為開(kāi)始結(jié)束的標(biāo)志)

變量

變量類型

運(yùn)行shell時(shí),會(huì)同時(shí)存在三種變量:

  • 局部變量:局部變量在腳本或命令中定義,僅在當(dāng)前shell實(shí)例中有效,其他shell啟動(dòng)的程序不能訪問(wèn)局部變量。
  • 環(huán)境變量:所有的程序,包括shell啟動(dòng)的程序,都能訪問(wèn)環(huán)境變量,有些程序需要環(huán)境變量來(lái)保證其正常運(yùn)行。必要的時(shí)候shell腳本也可以定義環(huán)境變量。
  • shell變量:shell變量是由shell程序設(shè)置的特殊變量。shell變量中有一部分是環(huán)境變量,有一部分是局部變量,這些變量保證了shell的正常運(yùn)行

變量操作

  • 創(chuàng)建普通變量: name=“test” (=兩邊不可有空格)
  • 創(chuàng)建只可函數(shù)體中使用的局部變量: local name=“test” (使用local修飾的變量在函數(shù)體外無(wú)法訪問(wèn),并且local只能在函數(shù)體內(nèi)使用)
  • 使用變量: echo $name 或者 echo ${name} (推薦使用大括號(hào)版)
  • 變量重新賦值: name=“new_test” (將原值覆蓋)
  • 只讀變量: name=“only_read” -> readonly name (使用readonly標(biāo)識(shí)后的變量,不可被修改)
  • 刪除變量: unset name; (刪除之后不可訪問(wèn),刪除不掉只讀變量)

字符串變量

1)單引號(hào)

  • 單引號(hào)變量var='test' ,只能原樣輸出,變量無(wú)效
  • 單引號(hào)中不能出現(xiàn)一個(gè)單獨(dú)的單引號(hào),轉(zhuǎn)義也不可以

2)雙引號(hào)

  • 雙引號(hào)變量var="my name is ${name}",變量有效
  • 可出現(xiàn)轉(zhuǎn)義符

3)拼接字符串

  • 中間無(wú)任何+,之類的字符
  • name=“this is”" my name"; name=“this is my name”; name=“this” is “my name” 等效
  • name=‘this is'' my nam'; name=‘this is my name'; name=‘this' is ‘my name' 等效

4)獲取字符串長(zhǎng)度

  • 在${}中使用“#”獲取長(zhǎng)度
  • name=“test”;
  • echo ${#name}; # 輸出為4

5)提取子字符串

  • 1:4 從第2個(gè)開(kāi)始 往后截取4個(gè)字符
  • ::4 從第一個(gè)字符開(kāi)始 往后截取4個(gè)字符
  • name=“this is my name”;
  • echo ${name:1:4} #輸出 is i
  • echo ${name::4} #輸出 this

數(shù)組

bash只支持一維數(shù)組,不支持多維數(shù)組

  • 定義數(shù)組:array_name=(li wang xiang zhang) (小括號(hào)做邊界、使用空格分離)
  • 單獨(dú)定義數(shù)組的元素: array_para[0]=“w”; array_para[3]=“s” (定義時(shí)下標(biāo)不連續(xù)也可以)
  • 賦值數(shù)組元素:array_name[0]=“zhao”;
  • 獲取數(shù)組元素:
    • array_name[0]=“l(fā)i”
    • array_name[3]=“zhang”
    • echo ${array_name[0]} # 輸出"li"
    • echo ${array_name[1]} # 輸出" "
    • echo ${array_name[3]} # 輸出"zhang"
    • echo ${array_name[@]} # 輸出"li zhang" 輸出數(shù)組所有元素,沒(méi)有元素的下標(biāo)省略
  • 取得元素個(gè)數(shù):${#array_name[@]} 或者 ${#array_name[*]}
  • 取得單個(gè)元素長(zhǎng)度:${#array_name[1]}

參數(shù)傳遞

  • 獲取參數(shù)值:
    • $0 : 固定,代表執(zhí)行的文件名
    • $1 : 代表傳入的第1個(gè)參數(shù)
    • $n : 代表傳入的第n個(gè)參數(shù)
  • $#:參數(shù)個(gè)數(shù)
  • $*: 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)。如"$*“用「”」括起來(lái)的情況、以"$1 $2 … $n"的形式輸出所有參數(shù)
  • $@:與$*相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)。
  • $$:腳本運(yùn)行的當(dāng)前進(jìn)程號(hào)
  • $!:后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的ID
  • $?: 顯示最后命令的退出狀態(tài)。0表示沒(méi)有錯(cuò)誤,其他任何值表明有錯(cuò)誤。
  • $* 與 $@ 區(qū)別
    • 相同點(diǎn):都是引用所有參數(shù)。
    • 不同點(diǎn):只有在雙引號(hào)中體現(xiàn)出來(lái)。假設(shè)在腳本運(yùn)行時(shí)寫(xiě)了三個(gè)參數(shù) 1、2、3,,則 " * " 等價(jià)于 “1 2 3”(傳遞了一個(gè)參數(shù)),而 “@” 等價(jià)于 “1” “2” “3”(傳遞了三個(gè)參數(shù))。

運(yùn)算符

算數(shù)運(yùn)算

  • + 、-、*、\ : 乘號(hào)前必須加\進(jìn)行轉(zhuǎn)義才可以進(jìn)行乘法運(yùn)算
  • 加法運(yùn)算
    • val=`expr 2 + 2` (使用linux命令expr進(jìn)行輔助運(yùn)算)
    • val=$[2+2] (4個(gè)空格不是必要的,不同于條件判斷)
    • val=$((2+2))

數(shù)字關(guān)系運(yùn)算符

關(guān)系運(yùn)算符只支持?jǐn)?shù)字,不支持字符串,除非字符串的值是數(shù)字。

下面假定變量 a 為 10,變量 b 為 20

  • -eq :檢測(cè)兩個(gè)數(shù)是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
  • -ne: 檢測(cè)兩個(gè)數(shù)是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
  • -gt: 檢測(cè)左邊的數(shù)是否大于右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。
  • -lt : 檢測(cè)左邊的數(shù)是否小于右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。
  • -ge: 檢測(cè)左邊的數(shù)是否大于等于右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。
  • -le : 檢測(cè)左邊的數(shù)是否小于等于右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。

字符串運(yùn)算符

下表列出了常用的字符串運(yùn)算符,假定變量 a 為 “abc”,變量 b 為 “efg”:

  • = :檢測(cè)兩個(gè)字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
  • != :檢測(cè)兩個(gè)字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
  • -z :檢測(cè)字符串長(zhǎng)度是否為0,為0返回 true。 [ -z $a ] 返回 false。
  • -n :檢測(cè)字符串長(zhǎng)度是否為0,不為0返回 true。 [ -n “$a” ] 返回 true。
  • $ :檢測(cè)字符串是否為空,不為空返回 true。 [ $a ] 返回 true。

布爾運(yùn)算符

下表列出了常用的布爾運(yùn)算符,假定變量 a 為 10,變量 b 為 20:

  • ! :非運(yùn)算,表達(dá)式為 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
  • -o :或運(yùn)算,有一個(gè)表達(dá)式為 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
  • -a :與運(yùn)算,兩個(gè)表達(dá)式都為 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

邏輯運(yùn)算符

以下介紹 Shell 的邏輯運(yùn)算符,假定變量 a 為 10,變量 b 為 20:

  • && :邏輯的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
  • || :邏輯的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

文件運(yùn)算符

  • -b file :檢測(cè)文件是否是塊設(shè)備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
  • -c file :檢測(cè)文件是否是字符設(shè)備文件,如果是,則返回 true。 [ -c $file ] 返回 false。
  • -d file :檢測(cè)文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
  • -f file :檢測(cè)文件是否是普通文件(既不是目錄,也不是設(shè)備文件),如果是,則返回 true。 [ -f $file ] 返回 true。
  • -g file :檢測(cè)文件是否設(shè)置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
  • -k file :檢測(cè)文件是否設(shè)置了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
  • -p file :檢測(cè)文件是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
  • -u file :檢測(cè)文件是否設(shè)置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
  • -r file :檢測(cè)文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
  • -w file :檢測(cè)文件是否可寫(xiě),如果是,則返回 true。 [ -w $file ] 返回 true。
  • -x file :檢測(cè)文件是否可執(zhí)行,如果是,則返回 true。 [ -x $file ] 返回 true。
  • -s file :檢測(cè)文件是否為空(文件大小是否大于0),不為空返回 true。 [ -s $file ] 返回 true。
  • -e file :檢測(cè)文件(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。

執(zhí)行相關(guān)

命令替換

命令替換與變量替換差不多,都是用來(lái)重組命令行的,先完成引號(hào)里的命令行,然后將其結(jié)果替換出來(lái),再重組成新的命令行。
執(zhí)行命令:

  • `ls /etc` : 反引號(hào) (所有的unix系統(tǒng)都支持)
  • $(ls /etc) : $+() (部分unix系統(tǒng)不支持)

多個(gè)嵌套使用時(shí),從內(nèi)向外執(zhí)行

for file in \s /etc\ 或 for file in $(ls /etc) 循環(huán)中使用
`dirname $0` 獲取腳本文件所在的目錄
path=$(cd `dirname $0`;pwd) : 獲取腳本當(dāng)前所在目錄,并且執(zhí)行cd命令到達(dá)該目錄,使用pwd獲取路徑并賦值到path變量

算術(shù)運(yùn)算

  • $[ ] : 加減乘除,不必添加空格
  • $(( )) :加減乘除等,不必添加空格

邏輯判斷

  • [ ] : 中括號(hào)旁邊和運(yùn)算符兩邊必須添加空格 (可以使用,不推薦)
  • [[ ]]:中括號(hào)旁邊和運(yùn)算符兩邊必須添加空格 (字符串驗(yàn)證時(shí),推薦使用)
  • (()) : 中括號(hào)旁邊和運(yùn)算符兩邊必須添加空格 (數(shù)字驗(yàn)證時(shí),推薦使用)
  • [[]] 和 (()) 分別是[ ]的針對(duì)數(shù)學(xué)比較表達(dá)式和字符串表達(dá)式的加強(qiáng)版。
  • 使用[[ … ]]條件判斷結(jié)構(gòu),而不是[ … ],能夠防止腳本中的許多邏輯錯(cuò)誤。比如,&&、||、<和> 操作符能夠正常存在于[[ ]]條件判斷結(jié)構(gòu)中,但是如果出現(xiàn)在[ ]結(jié)構(gòu)中的話,會(huì)報(bào)錯(cuò)。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不適用雙括號(hào), 則為if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

[[ ]]中增加模式匹配特效;
(( ))不需要再將表達(dá)式里面的大小于符號(hào)轉(zhuǎn)義,除了可以使用標(biāo)準(zhǔn)的數(shù)學(xué)運(yùn)算符外,還增加了以下符號(hào)

輸出

echo

僅用于字符串的輸出,沒(méi)有使用printf作為輸出的移植性好,建議使用printf

printf

printf 不會(huì)像 echo 自動(dòng)添加換行符,我們可以手動(dòng)添加 \n
無(wú)大括號(hào),直接以空格分隔

格式:printf format-string [arguments...] 其中(format-string: 格式控制字符串、arguments: 參數(shù)列表)

案例:printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234

%s %c %d %f 都是格式替代符

  • d:Decimal 十進(jìn)制整數(shù) 對(duì)應(yīng)位置參數(shù)必須是十進(jìn)制整數(shù),否則報(bào)錯(cuò)!
  • s:String 字符串 對(duì)應(yīng)位置參數(shù)必須是字符串或者字符型 否則報(bào)錯(cuò)
  • c:Char 字符 對(duì)應(yīng)位置參數(shù)必須是字符串或者字符型 否則報(bào)錯(cuò)
  • f:Float 浮點(diǎn) 對(duì)應(yīng)位置參數(shù)必須是數(shù)字型 否則報(bào)錯(cuò)

%-10s : 指一個(gè)寬度為10個(gè)字符(-表示左對(duì)齊,沒(méi)有則表示右對(duì)齊),任何字符都會(huì)被顯示在10個(gè)字符寬的字符內(nèi),如果不足則自動(dòng)以空格填充,超過(guò)也會(huì)將內(nèi)容全部顯示出來(lái)。

%-4.2f :指格式化為小數(shù),寬度為4個(gè)字符,其中.2指保留2位小數(shù)。

轉(zhuǎn)義符:

  • \a :警告字符,通常為ASCII的BEL字符
  • \b :后退
  • \c :抑制(不顯示)輸出結(jié)果中任何結(jié)尾的換行字符(只在%b格式指示符控制下的參數(shù)字符串中有效),而且,任何留在參數(shù)里的字符、任何接下來(lái)的參數(shù)以及任何留在格式字符串中的字符,都被忽略
  • \f :換頁(yè)(formfeed)
  • \n :換行
  • \r :回車(Carriage return)
  • \t :水平制表符
  • \v :垂直制表符
  • \ :一個(gè)字面上的反斜杠字符
  • \ddd :表示1到3位數(shù)八進(jìn)制值的字符。僅在格式字符串中有效
  • \0ddd :表示1到3位的八進(jìn)制值字符

流程控制

和Java、PHP等語(yǔ)言不一樣,sh的流程控制不可為空,即if或者else的大括號(hào)中無(wú)任何語(yǔ)句

if else

if
if condition
then
 command1 
 command2
 ...
 commandN 
fi

if else

if condition
then
 command1 
 command2
 ...
 commandN
else
 command
fi

if else-if else

if condition1
then
 command1
elif condition2 
then 
 command2
else
 commandN
fi

for

for var in item1 item2 ... itemN
do
 command1
 command2
 ...
 commandN
done

while

while condition

while condition
do
 command
done

while 無(wú)限循環(huán)

while :
do
 command
done

until

until 循環(huán)執(zhí)行一系列命令直至條件為 true 時(shí)停止。
until 循環(huán)與 while 循環(huán)在處理方式上剛好相反。

until condition
do
 command
done

case

Shell case語(yǔ)句為多選擇語(yǔ)句??梢杂胏ase語(yǔ)句匹配一個(gè)值與一個(gè)模式,如果匹配成功,執(zhí)行相匹配的命令。
case需要一個(gè)esac(就是case反過(guò)來(lái))作為結(jié)束標(biāo)記,每個(gè)case分支用右圓括號(hào),用兩個(gè)分號(hào)表示break,其中“;;”不是跳出循環(huán),是不在去匹配下面的模式
case語(yǔ)句格式如下:

case 值 in
 模式1)
 command1
 command2
 ...
 commandN
 ;;
 模式2)
 command1
 command2
 ...
 commandN
 ;;
esac

跳出循環(huán)

  • break :跳出總循環(huán)
  • continue:跳出當(dāng)前循環(huán),繼續(xù)下一次循環(huán)

定義函數(shù)

可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數(shù)。

函數(shù)定義

[ function ] funname()
{
 action;
 [return int;]
}

參數(shù)傳遞

  • 調(diào)用函數(shù): fun_name 2 3 4
  • 函數(shù)中使用:和shell取用函數(shù)相同 $n $# $* $? 或者加上{}
funWithParam(){
 echo "第一個(gè)參數(shù)為 $1 !"
 echo "第二個(gè)參數(shù)為 $2 !"
 echo "第十個(gè)參數(shù)為 $10 !"
 echo "第十個(gè)參數(shù)為 ${10} !"
 echo "第十一個(gè)參數(shù)為 ${11} !"
 echo "參數(shù)總數(shù)有 $# 個(gè)!"
 echo "作為一個(gè)字符串輸出所有參數(shù) $* !"}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
echo $? \# 判斷執(zhí)行是否成功

函數(shù)返回值

  • return字樣可存在也可不存在
  • return 只能為 return [0-255],此處的返回可作為函數(shù)執(zhí)行的狀態(tài),通過(guò)$?獲取的便是這個(gè)返回值
  • 如果不加return , 則默認(rèn)最后一條語(yǔ)句的執(zhí)行狀態(tài)所為函數(shù)執(zhí)行狀態(tài)的返回值,如果最后一條語(yǔ)句執(zhí)行成功,則$?為0,否則不為0

使用函數(shù)返回值(Janusgraph圖數(shù)據(jù)庫(kù)官方啟動(dòng)服務(wù)腳本片段)

  • return返回的數(shù)字,只是作為函數(shù)執(zhí)行狀態(tài)的返回值,也就是接下來(lái)$?獲取的值
  • 對(duì)于類似于下面的BIN=\abs_path``語(yǔ)句,獲取的是函數(shù)體內(nèi)所有的echo、printf輸出組合成的一個(gè)字符串
abs_path() {
 SOURCE="${BASH_SOURCE[0]}"
 while [ -h "$SOURCE" ]; do
  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
 done
 echo "test" 
 echo "$( cd -P "$( dirname "$SOURCE" )" && pwd )" 
 # 此函數(shù)的兩個(gè)echo輸出會(huì)組合成一個(gè)字符串作為下述BIN的值
}

 
BIN=`abs_path` # BIN賦值函數(shù)返回值,如果沒(méi)有return,則函數(shù)中所有的echo、printf輸出組合成一個(gè)字符串傳入BIN
path=${BIN}/nodetool # 可直接使用

輸入輸出重定向

一般情況下,每個(gè) Unix/Linux 命令運(yùn)行時(shí)都會(huì)打開(kāi)三個(gè)文件:

  • 標(biāo)準(zhǔn)輸入文件(stdin):stdin的文件描述符為0,Unix程序默認(rèn)從stdin讀取數(shù)據(jù)。
  • 標(biāo)準(zhǔn)輸出文件(stdout):stdout 的文件描述符為1,Unix程序默認(rèn)向stdout輸出數(shù)據(jù)。
  • 標(biāo)準(zhǔn)錯(cuò)誤文件(stderr):stderr的文件描述符為2,Unix程序會(huì)向stderr流中寫(xiě)入錯(cuò)誤信息。

默認(rèn)情況下,command > file 將 stdout 重定向到 file,command < file 將stdin 重定向到 file。
如果希望執(zhí)行某個(gè)命令,但又不希望在屏幕上顯示輸出結(jié)果,那么可以將輸出重定向到 /dev/null:

輸入重定向

  • bash.sh < file : 將腳本的輸入重定向到file,由file提供參數(shù)

輸出重定向

  • bash.sh > file : 將腳本的輸出數(shù)據(jù)重定向到file中,覆蓋數(shù)據(jù)
  • bash.sh >> file : 將腳本的輸出數(shù)據(jù)重定向到file中,追加數(shù)據(jù)
  • command >> file 2>&1 : 將 stdout 和 stderr 合并后重定向到 file

讀取外部輸入

命令:read arg (腳本讀取外部輸入并賦值到變量上)
在shell腳本執(zhí)行到上述命令時(shí),停止腳本執(zhí)行并等待外部輸入,將外部輸入賦值到arg變量上,繼續(xù)執(zhí)行腳本

文件引用

引用其他的文件之后,可以使用其變量、函數(shù)等等,相當(dāng)于將引用的文件包含進(jìn)了當(dāng)前文件

兩種方式:

  • . file_path\file_name
  • source file_path\file_name

顏色標(biāo)識(shí)

printf "\033[32m SUCCESS: yay \033[0m\n";
printf "\033[33m WARNING: hmm \033[0m\n";
printf "\033[31m ERROR: fubar \033[0m\n";

輸出結(jié)果:

長(zhǎng)句換行

在shell中為避免一個(gè)語(yǔ)句過(guò)長(zhǎng),可以使用“\”進(jìn)行換行
使用“\”換行,在腳本執(zhí)行過(guò)程中還是當(dāng)做一行一個(gè)語(yǔ)句執(zhí)行,不同于enter直接換行

注意:\ 前添加一個(gè)空格 。 \ 后無(wú)空格直接換行。

 /mysql/bin/mysql \
 -h test_host -P 000 \
 -u test_user -ptest_password ;

shell操作mysql

下面案例為登錄mysql,并選擇操作數(shù)據(jù)庫(kù),之后進(jìn)行導(dǎo)入數(shù)據(jù)

 /mysql/mysql/bin/mysql \
 -h test_host -P 000 \
 -u test_user -ptest_password \
 -e"use test_database; source data_faile; " # -e 代表執(zhí)行sql語(yǔ)句

-u 用戶名
-p 用戶密碼
-h 服務(wù)器ip地址
-D 連接的數(shù)據(jù)庫(kù)
-N 不輸出列信息
-B 使用tab鍵 代替 分隔符
-e 執(zhí)行的SQL語(yǔ)句

退出腳本

命令:exit

在退出腳本時(shí)使用不同的錯(cuò)誤碼,這樣可以根據(jù)錯(cuò)誤碼來(lái)判斷發(fā)生了什么錯(cuò)誤。

在絕大多數(shù) shell 腳本中,exit 0 表示執(zhí)行成功,exit 1 表示發(fā)生錯(cuò)誤。
對(duì)錯(cuò)誤與錯(cuò)誤碼進(jìn)行一對(duì)一的映射,這樣有助于腳本調(diào)試。

命令:set -e 或者 set +e

set -e表示從當(dāng)前位置開(kāi)始,如果出現(xiàn)任何錯(cuò)誤都將觸發(fā)exit。相反,set +e表示不管出現(xiàn)任何錯(cuò)誤繼續(xù)執(zhí)行腳本。

如果腳本是有狀態(tài)的(每個(gè)后續(xù)步驟都依賴前一個(gè)步驟),那么請(qǐng)使用set -e,在腳本出現(xiàn)錯(cuò)誤時(shí)立即退出腳本。
如果要求所有命令都要執(zhí)行完(很少會(huì)這樣),那么就使用set +e。

shell腳本調(diào)試

檢查是否有語(yǔ)法錯(cuò)誤-n:

bash -n script_name.sh

使用下面的命令來(lái)執(zhí)行并調(diào)試 Shell 腳本-x:

bash -x script_name.sh

調(diào)試count_odd_number.sh 程序案例:

#!/usr/bin.env bash

# 用于計(jì)算數(shù)組中奇數(shù)的和
# @author liyangyang
# @time 2019/09/17

sum=0
for num in 1 2 3 4;do
 re=${num}%2
 if (( ${re} == 1 ));then
  sum=$[${sum}+${num}]
 fi
done
echo ${sum}

首先檢查有無(wú)語(yǔ)法錯(cuò)誤:

bash -n count_odd_number.sh

沒(méi)有輸出,說(shuō)明沒(méi)有錯(cuò)誤,開(kāi)始實(shí)際調(diào)試:

bash -x count_odd_number.sh

調(diào)試結(jié)果如下:

+ sum=0
+ for num in 1 2 3 4
+ re=1%2
+ (( 1%2 == 1 ))
+ sum=1
+ for num in 1 2 3 4
+ re=2%2
+ (( 2%2 == 1 ))
+ for num in 1 2 3 4
+ re=3%2
+ (( 3%2 == 1 ))
+ sum=4
+ for num in 1 2 3 4
+ re=4%2
+ (( 4%2 == 1 ))
+ echo 4
4

其中的輸出顯示了程序執(zhí)行的每一步,通過(guò)觀察程序執(zhí)行的步驟是否滿足預(yù)期從而達(dá)到調(diào)試的效果
帶有 + 表示的是 Shell 調(diào)試器的輸出,不帶 + 表示程序的輸出。

案例:

這是es(ElasticSearch)官方啟動(dòng)服務(wù)的腳本,看可不可以理解吧~

#!/usr/bin/env bash

# CONTROLLING STARTUP:
#
# This script relies on a few environment variables to determine startup
# behavior, those variables are:
#
# ES_PATH_CONF -- Path to config directory
# ES_JAVA_OPTS -- External Java Opts on top of the defaults set
#
# Optionally, exact memory values can be set using the `ES_JAVA_OPTS`. Note that
# the Xms and Xmx lines in the JVM options file must be commented out. Example
# values are "512m", and "10g".
#
# ES_JAVA_OPTS="-Xms8g -Xmx8g" ./bin/elasticsearch

source "`dirname "$0"`"/elasticsearch-env

parse_jvm_options() {
 if [ -f "$1" ]; then
 echo "`grep "^-" "$1" | tr '\n' ' '`"
 fi
}

ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.options

ES_JAVA_OPTS="`parse_jvm_options "$ES_JVM_OPTIONS"` $ES_JAVA_OPTS"

# manual parsing to find out, if process should be detached
if ! echo $* | grep -E '(^-d |-d$| -d |--daemonize$|--daemonize )' > /dev/null; then
 exec \
 "$JAVA" \
 $ES_JAVA_OPTS \
 -Des.path.home="$ES_HOME" \
 -Des.path.conf="$ES_PATH_CONF" \
 -cp "$ES_CLASSPATH" \
 org.elasticsearch.bootstrap.Elasticsearch \
 "$@"
else
 exec \
 "$JAVA" \
 $ES_JAVA_OPTS \
 -Des.path.home="$ES_HOME" \
 -Des.path.conf="$ES_PATH_CONF" \
 -cp "$ES_CLASSPATH" \
 org.elasticsearch.bootstrap.Elasticsearch \
 "$@" \
 <&- &
 retval=$?
 pid=$!
 [ $retval -eq 0 ] || exit $retval
 if [ ! -z "$ES_STARTUP_SLEEP_TIME" ]; then
 sleep $ES_STARTUP_SLEEP_TIME
 fi
 if ! ps -p $pid > /dev/null ; then
 exit 1
 fi
 exit 0
fi

exit $?

到此這篇關(guān)于一篇教會(huì)你寫(xiě)90%的shell腳本(入門(mén)小結(jié))的文章就介紹到這了,更多相關(guān)shell腳本入門(mén)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Shell中使用grep、sed正則提取和替換字符串

    Shell中使用grep、sed正則提取和替換字符串

    這篇文章主要介紹了Shell中使用grep、sed正則提取和替換字符串,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • nginx日志切割腳本分享

    nginx日志切割腳本分享

    nginx日志太大怎么辦,只有分割一下了,這篇文章就介紹了一下nginx日志切割腳本,需要的朋友可以參考下
    2014-03-03
  • linux shell 中雙引號(hào)和單引號(hào)的區(qū)別解析

    linux shell 中雙引號(hào)和單引號(hào)的區(qū)別解析

    最近在編寫(xiě)shell腳本時(shí),發(fā)現(xiàn)引號(hào)使用的比較頻繁,也出現(xiàn)過(guò)小問(wèn)題,現(xiàn)根據(jù)我的使用情況做一下總結(jié),也加深一下自己的印象,這篇文章主要介紹了linux shell 中雙引號(hào)和單引號(hào)的區(qū)別解析,需要的朋友可以參考下
    2024-02-02
  • Shell實(shí)現(xiàn)程序造死循環(huán)的幾種方法示例

    Shell實(shí)現(xiàn)程序造死循環(huán)的幾種方法示例

    在linux下編程的程序猿都知道shell腳本,就算你不怎么熟悉,也應(yīng)該聽(tīng)過(guò)的吧!那在shell腳本中的死循環(huán)該怎么寫(xiě)呢?下面這篇文章就來(lái)給大家介紹了關(guān)于Shell如何實(shí)現(xiàn)讓程序造死循環(huán)的幾種方法,需要的朋友可以參考下。
    2017-08-08
  • linux echo命令以及l(fā)inux echo命令提示權(quán)限不夠的解決辦法

    linux echo命令以及l(fā)inux echo命令提示權(quán)限不夠的解決辦法

    linux的echo命令, 在shell編程中極為常用, 在終端下打印變量value的時(shí)候也是常常用到的, 因此有必要了解下echo的用法。下面通過(guò)本文給大家介紹linux echo命令以及l(fā)inux echo命令提示權(quán)限不夠的解決辦法,感興趣的朋友一起看看吧
    2017-09-09
  • Linux通過(guò)命令壓縮與解壓縮的方法| tar, tar.gz, tar.bz2

    Linux通過(guò)命令壓縮與解壓縮的方法| tar, tar.gz, tar.bz2

    這篇文章主要介紹了Linux通過(guò)命令壓縮與解壓縮的方法| tar, tar.gz, tar.bz2,內(nèi)容囊括了打包、壓縮、解壓縮的基本概念,最后通過(guò)實(shí)例講解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下吧
    2017-04-04
  • Linux shell ftp命令根據(jù)文件日期下載文件的方法

    Linux shell ftp命令根據(jù)文件日期下載文件的方法

    最近做項(xiàng)目遇到這樣的需求要求ftp獲取遠(yuǎn)程數(shù)據(jù)的文件,根據(jù)文件的創(chuàng)建時(shí)間點(diǎn)下載文件。下面小編給大家分享知識(shí)點(diǎn)小結(jié),感興趣的朋友要求看看吧
    2017-09-09
  • nvidia-smi命令詳解和一些高階技巧講解

    nvidia-smi命令詳解和一些高階技巧講解

    一般情況下用的比較多的就是nvidia-smi的命令,其實(shí)掌握了這一個(gè)命令也就能夠覆蓋絕大多數(shù)場(chǎng)景了,但是本質(zhì)求真務(wù)實(shí)的態(tài)度,本文調(diào)研了相關(guān)資料,整理了一些比較常用的nvidia-smi命令的其他用法,感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • Linux內(nèi)核鏈表實(shí)現(xiàn)過(guò)程

    Linux內(nèi)核鏈表實(shí)現(xiàn)過(guò)程

    本文講解Linux內(nèi)核鏈表實(shí)現(xiàn)的過(guò)程,說(shuō)了鏈表的定義及初始化宏定義、操作和刪除操作等內(nèi)容,詳細(xì)看下面
    2013-11-11
  • Shell腳本中使用getopts處理多命令行選項(xiàng)

    Shell腳本中使用getopts處理多命令行選項(xiàng)

    今天小編就為大家分享一篇關(guān)于Shell腳本中使用getopts處理多命令行選項(xiàng),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03

最新評(píng)論

平湖市| 赤壁市| 蒲城县| 益阳市| 封开县| 景宁| 桐乡市| 邹平县| 板桥市| 朝阳市| 稷山县| 西贡区| 奇台县| 乌什县| 嘉荫县| 罗田县| 蚌埠市| 浑源县| 卓资县| 惠水县| 抚远县| 兴山县| 泸定县| 嘉祥县| 长白| 贵港市| 鹰潭市| 中西区| 梧州市| 新疆| 定兴县| 新民市| 秭归县| 黔江区| 涞水县| 易门县| 陕西省| 双峰县| 弥渡县| 巨野县| 丰顺县|