本篇內(nèi)容介紹了“LINUX下Bash-Script的用法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)沙洋,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108
LINUX shell的種類非常之多,但是目前用得最為廣泛的還是Bash,本文也是基于Bash的Shell環(huán)境。 下面是一個(gè)簡(jiǎn)單的示例:
#! /bin/sh echo 'hello world!'
這就是一個(gè)最簡(jiǎn)單的shell腳本了。 第一行的#!
用來(lái)告訴系統(tǒng),這個(gè)腳本用什么解釋器來(lái)執(zhí)行(說(shuō)明:sh和bash本身是不同的Shell,但是在我目前用得CentOS7版本sh和bash是等價(jià)的,sh是一個(gè)指向bash的符號(hào)鏈接)。 echo
命令輸出文本到屏幕
一種方式就是將腳本作為解釋器的參數(shù),如:
sh test.sh
第二種方式就是授予文件可執(zhí)行權(quán)限
chmod +x test.sh 或者 chmod 755 test.sh 執(zhí)行腳本 ./test.sh
Bash是一種弱類型的語(yǔ)言,你只需要直接定義變量名=value
即可。當(dāng)需要引用這個(gè)變量的時(shí)候使用$var_name
或者${var_name}
即可。 $var_name
是${var_name}
的一種簡(jiǎn)寫形式,但是在某些情況下只能使用${var_name}
,例如:
# 當(dāng)需要連接兩個(gè)變量 your_id=${USER}-on-${HOSTNAME} # 或者會(huì)與其他字符串寫在一起的時(shí)候 echo '${num}instance running!'
所以建議在寫shell的時(shí)候統(tǒng)一使用${var_name}
的風(fēng)格。 bash中變量是弱類型的,那么不管你傳給他的是字符串、數(shù)字或者數(shù)組他都統(tǒng)統(tǒng)會(huì)接收,有時(shí)候這就會(huì)導(dǎo)致一些問題,比如你想做個(gè)計(jì)算器,這時(shí)候傳給了變量一個(gè)'ABCDEFG',那么這時(shí)候我們就想這個(gè)變量只能接收數(shù)字。又或者你想定義一個(gè)常量,不想用戶修改。那么以上這些我們可以使用declare
來(lái)聲明變量的一些屬性。 declare常用參數(shù)如下:
-r 定義一個(gè)只讀變量,也可以使用"readonly var_name"將變量定義為只讀變量 -i 定義變量類型為整型 -a 定義變量類型為數(shù)組 -f 定義一個(gè)函數(shù) -x 定義一個(gè)全局變量
當(dāng)想刪除一個(gè)變量的時(shí)候直接使用unset var_name
即可,注意這個(gè)命令不能刪除只讀變量。
那么如何向一個(gè)腳本傳遞參數(shù)呢? 當(dāng)我們想向一個(gè)腳本傳遞參數(shù)的時(shí)候,直接在執(zhí)行腳本的命令后面跟參數(shù)即可:
sh ./test.sh parm1 parm2 parm3
在腳本中使用$n
(n是一個(gè)數(shù)字,如:$1獲取第一個(gè)參數(shù))來(lái)接收傳入的參數(shù)即可。下面是可能經(jīng)常用到的參數(shù)變量:
$0 當(dāng)前腳本的文件名。 $n 傳遞給腳本或函數(shù)的參數(shù)。n是一個(gè)數(shù)字。例如,第一個(gè)參數(shù)是 $1 。 $# 傳遞給腳本或函數(shù)的參數(shù)個(gè)數(shù)。 $* 傳遞給腳本或函數(shù)的所有參數(shù)。 $@ 傳遞給腳本或函數(shù)的所有參數(shù)。被雙引號(hào) (" ")包含時(shí)與$*不同。 $? 上個(gè)命令的退出狀態(tài),或函數(shù)的返回值。 $_ 上一個(gè)命令的最后一個(gè)參數(shù)
我們經(jīng)常用到的Linux命令中有一種叫option的東西,基本模式-optionname
或者--longoptionname
。如果在我們編寫腳本的時(shí)候需要option的話,簡(jiǎn)單的腳本直接把他當(dāng)普通參數(shù)手工處理即可,面對(duì)比較復(fù)雜的可以使用getopt或者getopt。 這里感覺有必要提一下set
這個(gè)命令,我覺得很牛逼、很厲害、很有用但是我從來(lái)沒在腳本中使用過(guò)的命令。 set
命令用來(lái)改變內(nèi)部腳本的變量或者選項(xiàng)。一種應(yīng)用就是來(lái)改變options來(lái)影響腳本的行為。另一種應(yīng)用就是利用set `commond`
的輸出來(lái)重置位置參數(shù)。
#!/bin/bash echo "Command-line argument #1 = $1" echo "Command-line argument #2 = $2" echo "Command-line argument #3 = $3" echo "--------------------------------------" echo "利用`uname -a`的輸出來(lái)重置位置參數(shù)" set `uname -a` echo "Field #1 of 'uname -a' = $1" echo "Field #2 of 'uname -a' = $2" echo "Field #3 of 'uname -a' = $3" exit 0 output: [root@localhost study]# sh test_set.sh one two three Command-line argument #1 = one Command-line argument #2 = two Command-line argument #3 = three -------------------------------------- Sets the positional parameters to the output of the commond `uname -a` Field #1 of 'uname -a' = Linux Field #2 of 'uname -a' = localhost.localdomain Field #3 of 'uname -a' = 3.10.0-514.el7.x86_64
目前只支持一維數(shù)組?。。。。。。。。?! 可以通過(guò)以下兩種方式來(lái)為數(shù)組賦值:
#!/bin/bash my_array=(A B C "D") my_array[4]=F my_array[5]="G"
通過(guò)${my_array[idx]}
來(lái)讀取數(shù)組中的值,也可以通過(guò)${my_array[*]}
或${my_array[@]}
來(lái)一次性讀取數(shù)組中的所有元素。通過(guò)${#my_array[*]}
或${#my_array[@]}
來(lái)獲取數(shù)組長(zhǎng)度。
#!/bin/bash my_array=(A B C "D") my_array[4]=F my_array[5]="G123" echo "第一個(gè)元素:${my_array[0]}" echo "通過(guò)*來(lái)獲取數(shù)組所有元素:${my_array[*]}" echo "通過(guò)@來(lái)獲取數(shù)組所有元素:${my_array[@]}" echo "通過(guò)*來(lái)獲取數(shù)組長(zhǎng)度:${#my_array[*]}" echo "通過(guò)@來(lái)獲取數(shù)組長(zhǎng)度:${#my_array[@]}" output: [root@localhost study]# sh test_arr.sh 第一個(gè)元素:A 通過(guò)*來(lái)獲取數(shù)組所有元素:A B C D F G123 通過(guò)@來(lái)獲取數(shù)組所有元素:A B C D F G123 通過(guò)*來(lái)獲取數(shù)組長(zhǎng)度:6 通過(guò)@來(lái)獲取數(shù)組長(zhǎng)度:6
反引號(hào)括起來(lái)的字符串被bash解釋為命令行執(zhí)行,并以它的輸出結(jié)果取代整個(gè)反引號(hào)部分。
#! /bin/sh str=`echo $PATH` echo ${str} output: [root@localhost study]# sh qut.sh /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
單引號(hào)擴(kuò)起來(lái)的字符都視作普通字符,所有特殊字符都會(huì)失去原油的意義。
#! /bin/sh str='${PATH}' echo ${str} output: [root@localhost study]# sh qut.sh ${PATH}
由雙引號(hào)括起來(lái)的字符,除$、\、’、和”這幾個(gè)字符仍是特殊字符并保留其特殊功能外,其余字符作為普通字符對(duì)待。
for循環(huán)的一般格式為
for var in [list] do commonds done
下面來(lái)看個(gè)例子:
#!/bin/bash # 如果后面的list不加引號(hào),則默認(rèn)以空格分割 for var in A B C D do echo "${var}" done echo;echo # 會(huì)將引號(hào)內(nèi)的內(nèi)容當(dāng)做一個(gè)元素 for var in "A A" "B B B" "C C" do echo "${var}" done echo;echo # 上面兩種寫法有點(diǎn)類似java的for-each # 如果你用過(guò)C,那么你對(duì)下面這種寫法更熟悉 for ((a=1, b=1; a <= 5 ; a++, b++)) do echo -n "$a-$b " done output: [root@localhost study]# sh for-loop.sh A B C D A A B B B C C 1-1 2-2 3-3 4-4 5-5
while循環(huán)的一般格式為
while [ condition ] do commands done
Example:
#!/bin/bash while (( a <= 5 )) do echo -n "$a " let "a+=1" done
break用來(lái)跳出整個(gè)循環(huán),continue跳出本次循環(huán)。
首先來(lái)看個(gè)例子:
#! /bin/bash b=1+2 echo "$" output: [root@localhost study]# sh test.sh 1+2
默認(rèn)情況下,bash中會(huì)把所有的賦值當(dāng)做字符或字符串,所以看到的輸出是1+2
而不是3
。 可以用以下三種方式來(lái)做算術(shù)運(yùn)算。
#! /bin/bash # 1、使用`declare`來(lái)聲明變量為整型。 declare -i b b=1+2 echo "declare:$" echo;echo # 2、let命令 let "c=1+1" echo "let:${c}" echo;echo # 3、利用雙括號(hào)將表達(dá)式括起來(lái) ((d=2+3)) echo "((表達(dá)式)):$cdofm4k" echo;echo # 4、利用單個(gè)方括號(hào) echo "[表達(dá)式]:$[1+2]" output: [root@localhost study]# sh test.sh declare:3 let:2 ((表達(dá)式)):5 [表達(dá)式]:3
首先需要注意的是在Linux中“0”表示成功。test命令用來(lái)檢查某個(gè)條件是否成立,它可以進(jìn)行數(shù)值、字符和文件三個(gè)方面的測(cè)試。
直接使用test
這個(gè)命令
[...]:繼承自test命令,主要用來(lái)方便其他語(yǔ)言的程序員。
((...)): 返回其中表達(dá)式的計(jì)算結(jié)果
Example:
[root@localhost ~]# test 1 -lt 2 [root@localhost ~]# echo $? 0 [root@localhost ~]# [ 1 -lt 2 ] [root@localhost ~]# echo $? 0 [root@localhost ~]# [[ 2 -eq 2 ]] [root@localhost ~]# echo $? 0 [root@localhost ~]# (( 2 == 2 )) [root@localhost ~]# echo $? 0
數(shù)值測(cè)試操作符:
-eq 或 == : 是否相等
-ne 或 != : 不等于
-gt 或 > : 大于
-lt 或 < : 小于
-ge 或 >= : 大于等于
-le 或 <= : 小于等于 注意:或選項(xiàng)的用法其實(shí)就是講數(shù)字當(dāng)做字符串來(lái)比較
Example:
#! /bin/sh a=4 b=5 if [ ${a} -ne $ ] then echo "${a} is not equal to $ fi echo if [ ${a} != $ ] then echo "${a} is not equal to $." fi
= : 判斷兩個(gè)字符串是否相等。if [ "$a" = "$b" ]
== : 判斷兩個(gè)字符串是否相等,=的一個(gè)同義詞
!= : 判斷字符串是否不等
< : 小于,根據(jù)ASCII的排序,注意在[ a < b ]需要轉(zhuǎn)義,在[[ a < b ]]可以直接使用,>同理
: 大于,根據(jù)ASCII的排序
-z : 字符串是否為空,或長(zhǎng)度為0
-n : 字符串是否非空
Example:
#! /bin/sh str1="" if [ -z ${str1} ] then echo "str1 is null" fi echo str1="abc" if [ -n ${str1} ] then echo "str1 is not null" fi echo str2="cdef" if [ "${str1}" != "${str2}" ] then echo "${str1} is not equal to ${str2}" fi
下面列舉一些常用的文件操作:
-e : 文件或目錄是否存在
-f : 是否是一個(gè)文件(而非目錄)
-d : 是否是目錄
-s : 文件大小是否為0
-r : 是否對(duì)文件有讀權(quán)限
-w : 是否對(duì)文件有寫權(quán)限
-x : 是否對(duì)文件有執(zhí)行權(quán)限
-O : 是否是文件所有者
-G :是否與文件組用戶相同
Example:
#! /bin/sh filename="/study/bash/test_file.txt" if [ -e "${filename}" ] then echo "${filename} file exists." fi if [ -f "${filename}" ] then echo "${filename} is a regular file." fi if [ -s "${filename}" ] then echo "${filename} not a zero file." fi
if語(yǔ)句的一般格式:
if condition then commonds fi
if-else語(yǔ)句的格式
if condition1 then commonds elif condition2 then commonds else commonds fi
case語(yǔ)句的一般格式:
case 值 in 模式1) commonds ;; 模式2) commonds ;; esac
在case語(yǔ)句中可以用*
號(hào)來(lái)匹配任意值。
平時(shí)在一些簡(jiǎn)單的腳本里面基本用不到函數(shù),但是在復(fù)雜的腳本中用來(lái)組織代碼以及封裝常用邏輯,在bash中還是很好用的東西。 函數(shù)的定義格式如下:
[ function ] funname [()]{ action; [return ${result};] }
1、我們可以function funname
方式來(lái)定義,也可以直接funname()
。 2、可以顯示的加return來(lái)返回結(jié)果或者直接返回最后一條命令的執(zhí)行結(jié)果。
Example:
#! /bin/sh fun(){ echo "it's a function" } fun
向函數(shù)傳遞參數(shù)的形式類似執(zhí)行腳本的傳參:fun_name arg1 arg2
Example:
#! /bin/sh fun(){ if [ ${1} -gt ${2} ] then echo "${1} bigger than ${2}." elif [ ${2} -gt ${1} ] then echo "${2} bigger than ${1}." else echo "${1} equal to ${2}." fi } fun 10 20
可以通過(guò)read
命令來(lái)讀取標(biāo)準(zhǔn)輸入的值。下面用一個(gè)例子來(lái)看下在bash中read
的常用方式:
#! /bin/sh # 將讀取到的值賦值給var1這個(gè)變量,當(dāng)我們?cè)谛形布覾時(shí),按回車會(huì)換到下一行繼續(xù)輸入 read var1 echo "var1 is ${var1}" echo "===============================" # 直接read,可以使用$REPLY來(lái)獲取讀取到的值 read echo "read $REPLY" echo "===============================" # -r參數(shù)會(huì)按字符串解釋\,而不會(huì)換行 read -r mul_line echo "mul_line:${mul_line}" echo "===============================" # 上面的方式都會(huì)在屏幕上打印輸入值,在交互式的bash中是不友好的,我們可以加-s選項(xiàng)來(lái)屏蔽輸入的打印 read -s var2 echo "dont echo input:${var2}" echo "===============================" # 有時(shí)候可能不希望一直等待用戶輸入,我們可以用-t選項(xiàng)來(lái)這只超時(shí)時(shí)間 TIMELIMIT=5 read -t $TIMELIMIT var3 if [ -z ${var3}] then var3="time out" fi echo "timed read:${var3}"
下面是測(cè)試的輸出
[root@localhost study]# sh read_test.sh read value to var2\ new line var1 is read value to var2new line =============================== read had no var read read had no var =============================== read with -r option\ mul_line:read with -r option\ =============================== dont echo input:do not echo input =============================== timed read:time out
在大多數(shù)編程語(yǔ)言中,字符串是非常重要、常用的數(shù)據(jù)類型。 1、字符串長(zhǎng)度
${#string}
expr length $string
expr "$string" : '.*'
Example:
#! /bin/sh str1="fdhjksdf" echo "${#str1}" echo "`expr length ${str1}`" echo "`expr "${str1}" : '.*'`"
2、匹配子串長(zhǎng)度
expr match "$string" '$substr_regxp'
expr "$string" : '$substr_regxp'
Example:
#!/bin/sh str1="str;str-str;strend" sub_regxp="[a-z]*;" echo "`expr match "${str1}" "${sub_regxp}"`" echo "`expr "${str1}" : "${sub_regxp}"`"
3、子串開始索引
expr index $string $substring
Example
#! /bin/sh str="abc;efg;higj" rgx_str=";.*;" echo "`expr index ${str} ${rgx_str}`"
4、字符串截取
${string:position}
截取從postition位置開始的字符串${string:position:length}
從position位置開始截取長(zhǎng)度為length長(zhǎng)的子串,postition的開始索引為0expr substr $string $position $length
從position位置開始截取長(zhǎng)度為length長(zhǎng)的子串,postition的開始索引為1expr match "$string" '$sub_regxp'
截取匹配正則的子串expr "$string" : '$sub_regxp'
截取匹配正則的子串
Example
#! /bin/sh str="abc;defg;hijk;lmnpq" echo "\${string:position}" echo "${str:4}" echo "===================================" echo "\${string:position:length}" echo "${str:4:4}" echo "===================================" echo "expr substr \$string \$position \$length" echo "`expr substr ${str} 5 4`" echo "===================================" sub_regxp=".*;\(.*\);" echo "expr match "\$string" '${sub_regxp}'" echo "`expr match "${str}" ${sub_regxp}`" echo "===================================" echo "expr "\$string" : '\$sub_regxp'" echo "`expr "${str}" : ${sub_regxp}`" output: [root@localhost study]# sh sub_str.sh ${string:position} defg;hijk;lmnpq =================================== ${string:position:length} defg =================================== expr substr $string $position $length defg =================================== expr match $string '.*;\(.*\);' hijk =================================== expr $string : '$sub_regxp' hijk
5、刪除子串
${string#substring}
,從前面最小匹配刪除${string##substring}
,從前面最長(zhǎng)匹配刪除${string%substring}
,從后面最小匹配刪除${string%%substring}
,從后面最小匹配刪除
Example
#! /bin/sh str=abcABC123ABCabc reg_str='a*C' echo ${str#$reg_str} # 123ABCabc echo ${str##$reg_str} # abc reg_str='b*c' echo ${str%$reg_str} # abcABC123ABCa echo ${str%%$reg_str} # a
6、子串替換
${string/substring/replacement}
從前面最小匹配替換${string//substring/replacement}
從前面最長(zhǎng)匹配替換${string/#substring/replacement}
從后面最小匹配替換${string/%substring/replacement}
從后面最長(zhǎng)匹配替換
在bash中提供了相關(guān)的參數(shù)供我們進(jìn)行腳本的調(diào)試追蹤。
sh [-nvx] script.sh 參數(shù): -n:不執(zhí)行基本,只檢查語(yǔ)法問題 -v:執(zhí)行腳本前,先將腳本內(nèi)容輸出到屏幕上 -x:將使用到的內(nèi)容顯示到屏幕上
“LINUX下Bash-Script的用法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
網(wǎng)頁(yè)題目:LINUX下Bash-Script的用法
分享鏈接:http://muchs.cn/article14/pioede.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、網(wǎng)站策劃、面包屑導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站改版、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)