人妻丰满熟妇AV无码片,岛国AV无码免费无禁网站,丰满岳乱妇一区二区三区,男插女高潮一区二区

linux bash script簡明語法手冊

技術(shù)分享 2019-10-01 00:00:00
linux bash script簡明手冊

!腳本執(zhí)行與調(diào)試
1、絕對路徑執(zhí)行,要求文件有執(zhí)行權(quán)限
2、以sh命令執(zhí)行,不要求文件有執(zhí)行權(quán)限
3、.加空格或source命令執(zhí)行,腳本將在當(dāng)前shell中執(zhí)行
4、檢查腳本語法
bash -v test.sh
5、跟蹤腳本執(zhí)行
bash -x test.sh

!環(huán)境腳本執(zhí)行規(guī)則
用戶登錄:/etc/profile、~/.bash_profile、~/.bash_login、~/.profile
用戶注銷:~/.bash_logout
執(zhí)行新shell: /etc/bash.bashrc、~/.bashrc
執(zhí)行script(使用#!/bin/bash):如指定BASH_ENV的值,則執(zhí)行其指定的啟動文件
執(zhí)行script(使用#!/bin/sh):不調(diào)用任何環(huán)境腳本

!基本語法
1、腳本程序以#!/bin/bash 開始。以告之系統(tǒng)腳本以何種shell執(zhí)行。
2、以#開頭的行被視為注解,執(zhí)行時自動忽略。
3、每行不得多于255個字節(jié),可在行末加上反斜杠的方式拆分單行內(nèi)容到多行中。
例如:
test1=abcdefg\
hij\
klmnopq\
rstuvwxyz
4、多命令以分號分隔時,命令從左至右依次執(zhí)行。
例如: whoami;w
5、多命令以&&分隔時,命令從左至右按前面命令執(zhí)行成功后再執(zhí)行下個命令的原則依次執(zhí)行。
例如:make && make install
6、多命令以||分隔時,命令從左至右按前面命令執(zhí)行失敗后再執(zhí)行下個命令的原則依次執(zhí)行。
7、多個命令以分號分隔放置()中,則會啟用子shell并執(zhí)行。
例如:(mkdir testdir;cd testdir;touch testfile)
8、多個命令以分號分隔放置{}中,則會在當(dāng)前shell中執(zhí)行。需要注意的是命令和{}必須有空格間隔,并且最后一條命令也必須加分號。
例如:{ mkdir testdir;cd testdir;touch testfile; }
9、被反引號`括起來的命令或$(命令),shell將直接引用執(zhí)行結(jié)果。
例如:
test=`date`
test=$(date)
10、可以將算術(shù)運(yùn)算式以$的形式進(jìn)行求值。注意算術(shù)運(yùn)算式和必須有空格分隔,此方法只支持整型運(yùn)算。
例如:test=$
11、使用$((運(yùn)算式))的形式也可以進(jìn)行算術(shù)運(yùn)算求值,并且可以進(jìn)行布爾運(yùn)算。
例如:test=$((32*17))
12、使用let 運(yùn)算式也能進(jìn)行算術(shù)運(yùn)算,算術(shù)式各元素間不得有空格,否則應(yīng)將算術(shù)式用引號括起來。
例如:let ++test
13、任何命令執(zhí)行后均會返回一個取值范圍在0~255之間的整型返回碼。主要值含義如下:
0:正常結(jié)束
1:通用執(zhí)行錯誤
2:誤用shell命令
126:命令不可執(zhí)行
127:命令未找到
128:無效退出參數(shù)
130:被ctrl-c強(qiáng)行中止
255:退出狀態(tài)碼越界
shell script默認(rèn)返回最后一條命令的返回碼。可以使用exit退出script執(zhí)行并返回指定的返回碼。
例如:exit 15
通過$?這個系統(tǒng)變量可以獲取上一條命令的返回碼。
例如:
sync
echo $?
14、通過getopts命令獲取命令行選項(xiàng)。
語法為:getopts 選項(xiàng)行 選項(xiàng)變量。
選項(xiàng)行由各選項(xiàng)的單一字符組成,如某選項(xiàng)字符需要參數(shù),則在選項(xiàng)字符后加冒號。調(diào)用時此選項(xiàng)后無參數(shù)的話系統(tǒng)會提示錯誤,如不希望出現(xiàn)提示則應(yīng)在選項(xiàng)行最前面加上冒號。系統(tǒng)會將參數(shù)存入OPTARG變量。
例如:
#!/bin/bash
while getopts :a:bc opt
do
case $opt in
a)
echo "選項(xiàng)a,后跟參數(shù)OPTARG";;
b)
echo "選項(xiàng)b";;
c)
echo "選項(xiàng)c";;
*)
;;
esac
done
15、利用mktemp建立臨時文件
語法為:mktemp 選項(xiàng) 臨時文件模板
如果建立成功返回0。
臨時文件模板格式形式如:/tmp/test.XXXXXX或/usr/ttt/tttt.XXXXXX,文件名末6個字符必須為XXXXXX.生成成功后會由系統(tǒng)代替為隨機(jī)6個字符。
選項(xiàng)-q 不產(chǎn)生錯誤信息。
選項(xiàng)-p 指定建立臨時文件的父級目錄,父級目錄必須已存在。例如:mktemp -p /usr/tmp tf.XXXXXX
選項(xiàng)-t 按環(huán)境變量TMPDIR變量中指定的父級目錄建立臨時文件,如變量未定義,則父級目錄為/tmp
選項(xiàng)-d 建立的是臨時目錄。
直接執(zhí)行mktemp,會在/tmp目錄下建立tmp.XXXXXX形式的臨時文件,文件名末6個字符為隨機(jī)字符。可使用下面方式獲取生成的文件名。
$tmpfile=$(mktemp)



!變量
1、變量命名可使用英文字母、數(shù)字和下劃線,必須以英文字母開頭,區(qū)分大小寫。
2、每個shell都擁有自己的變量定義,彼此互不影響。
3、變量直接以等號賦值,注意等號兩邊不可留空,若等號右側(cè)有空格,賦值要用引號括起來。
例如:
test=1
test='hello world'
4、通過在變量名前加$的方式獲取變量的值。或者使用${變量名}的形式,以利于變量名和緊接其后的字母或下劃線進(jìn)行區(qū)分。
例如:${test}
5、通過${#變量}的形式獲取變量值字串的長度。
例如:test='12345';echo ${#test} #輸出5
6、可以將變量聲明為全局變量,全局變量作用范圍包含所有shell。命令為:xport 變量名
例如:export test
7、使用unset注銷變量,需要注意的是注銷僅局限于當(dāng)前shell,即使全局變量也一樣。unset -v 變量名
例如:unset test
8、清空變量的方式:變量名=
例如:test=
9、數(shù)組變量
使用變量名=(成員值1 成員值2 ...)的形式賦值,成員值之間以空格分隔。
例如:$testarray=(1 2 'abcd' 38)
數(shù)組值獲取使用$變量名的形式,下標(biāo)從0計(jì)數(shù)。
例如:$testarray
通過${變量名}或${變量名
}可以獲取數(shù)組所有成員,區(qū)別是,前者是各成員單獨(dú)輸出,后者是將所有成員以一個字符串的形式整體輸出。
通過${#變量名}或${#變量名
}可以獲取數(shù)組成員數(shù)量。例如:${#testarray}。
需要注意unset某個數(shù)組成員后,此成員的下標(biāo)并不移除。
例如:
testarray=(1 2 3 4 5 6)
unset testarray
echo testarray #無值輸出
echo testarray #輸出4
10、使用readonly可以聲明一個變量為只讀屬性。
例如:
readonly test #聲明test變量為只讀
readonly -f testfunc #聲明testfunc函數(shù)為只讀
readonly -a testarray #聲明testarray數(shù)組為只讀
11、bash shell可以通過declare進(jìn)行變量聲明。
例如:
declare -a testarray #定義一個數(shù)組變量
declare -i test #定義一個整型變量
declare -r test #定義一個只讀變量
declare -t test #設(shè)定變量具有trace屬性
declare -x test #定義一個環(huán)境變量
12、shell提供一組命令檢測變量是否存在或是否為空,根據(jù)檢測結(jié)果執(zhí)行對應(yīng)操作,列表如下:
${變量:-字串} 如果變量存在且有值,返回變量值,否則返回字串內(nèi)容。
${變量:=字串} 如果變量存在且有值,返回變量值,否則將字串賦給變量,并返回字串內(nèi)容。
${變量:?字串} 如果變量存在且有值,返回變量值,否則顯示將字串作為錯誤信息顯示,并退出script執(zhí)行。
${變量:+字串} 如果變量存在且有值,返回字串內(nèi)容,否則返回空值。
注:去掉命令中的:,則只檢測變量是否存在,不檢測是否為空。
13、變量可以通過${變量:起始位置:截取長度}的形式,過行取子串操作。如果從起始位置取至字串尾,則截取長度可以省略。
例如:
test="12345679"
echo ${test:1:3} #輸出234
echo ${test:2} #輸出3456789
14、變量可以通過命令對其字串值進(jìn)這行刪除替換處理,列表如下:
${變量#匹配式} 根據(jù)匹配式從左最短匹配子串并刪除。
${變量##匹配式} 根據(jù)匹配式從左貪婪匹配子串并刪除。
${變量%匹配式} 根據(jù)匹配式從右最短匹配子串并刪除。
${變量%%匹配式} 根據(jù)匹配式從右貪婪匹配子串并刪除。
${變量/匹配式/替換串} 根據(jù)匹配式從左匹配第一個子串替換成替換串。
${變量//匹配式/替換串} 根據(jù)匹配式匹配所有子串替換成替換串。
${變量/#匹配式/替換串} 根據(jù)匹配式從左匹配第一個子串替換成替換串。
${變量/匹配式/} 根據(jù)匹配式從左匹配第一個子串并刪除。
${變量//匹配式/} 根據(jù)匹配式從右匹配所有子串并刪除。
${變量/#匹配式/} 根據(jù)匹配式從左匹配第一個子串并刪除。
${變量/%匹配式/} 根據(jù)匹配式從右匹配所有子串并刪除。

!流程控制命令
1、if 條件轉(zhuǎn)向命令
基本格式:
if 命令A(yù)
then
命令
...
else
命令
...
fi

嵌套格式:
if 命令A(yù)
then
命令
...
elif 命令B
then
命令
...
elif 命令C
then
命令
...
...
...
fi

如果if后面跟的命令執(zhí)行返回碼為0則執(zhí)行then后面的命令,否則執(zhí)行else后面的命令。
if和then可以放到一行,前提是if后跟的命令加分號結(jié)尾。
例如:
if test -r /etc/passwd; then cat /etc/passwd; fi

2、case條件選擇命令
基本格式:
case 變量 in
匹配串1)
命令
...
;;
匹配串2)
命令
...
;;
... ...
... ...
匹配串n)
命令
...
;;
*)
命令
...
;;
esac

匹配串的格式:
單純字符串 完全匹配。
* 任意長度的任意字串,包括空串。例如:j*k,匹配jack、jak。
? 單個字符。例如:j??k,匹配jack,但不匹配jak。
字符集.例如:OK,匹配aOK、bOK、cOK。
| 匹配多個匹配串。例如:j??k|OK|jak。
如果打開extglob選項(xiàng),則能支持高級匹配。shopt -s extglob
?(匹配串) 匹配0個或1個括號里的匹配串。
*(匹配串) 匹配0個以上括號里的匹配串。
+(匹配串) 匹配1個括號里的匹配串。
@(匹配串) 匹配括號里的匹配串其中的一項(xiàng)。
!(匹配串) 匹配非括號里的匹配串。

3、for循環(huán)命令
基本格式1:
for 變量 in IFS分隔符定義的字串
do
命令
...
done

處理基本字串:
for i in 1 2 3 4 5 6 7 8 9
do
echo $i
done

從文件取串處理:
for i in $(cat /etc/passwd)
do
IFS_old=IFS
IFS=':'
for j in $i
do
echo "$j "
done
echo "---------------------------"
IFS=IFS_old
done

以通配符遍歷目錄:
for i in /etc/*
do
if ;;then
echo "$i 是文件"
fi
done

基本格式2:
for ((初始化;結(jié)束條件判斷;參數(shù)變更))
do
命令
...
done

此格式類似C語言,具體定義不再闡述。僅舉一例
for ((i=1,j=1;(i+j)<=100;i=i+1;j=j+1))
do
echo "$i,$j"
done

4、while循環(huán)命令
基本格式:
while 條件判斷
do
命令
...
done
當(dāng)條件符合條件判斷式時執(zhí)行循環(huán)體。

基本應(yīng)用:
i=0
while (($i<10))
do
echo $i
i=$(($i+1))
done

從文件讀取內(nèi)容:
while read line
do
echo $line
done < "/etc/passwd"

5、until循環(huán)命令
基本格式:
until 條件判斷
do
命令
...
done
當(dāng)條件不符合條件判斷式時執(zhí)行循環(huán)體。

6、select菜單選擇命令
基本格式:
select 變量 in IFS定義的分隔符分隔的字串行
do
命令
... ...
done

將字串以IFS定義的分隔符為界分解成若干項(xiàng),編號后列表顯示輸出,并將環(huán)境變量PS3定義的內(nèi)容作為選擇提示符顯示。根據(jù)用戶選擇進(jìn)行相應(yīng)的操作。
例如:
PS3="請您選擇:"
select sel in "測試 1" "測試選擇2" "測試選擇 3" "退出選擇"
do
case $sel in
"測試 1")
echo "測試 1";;
"測試選擇2")
echo "測試 2";;
"測試選擇 3")
echo "測試 3";;
*)
break
;;
esac
done


7、break命令,中止并跳出當(dāng)前循環(huán)體。

8、continue命令,直接結(jié)束此輪循環(huán),繼續(xù)下輪循環(huán)。

9、條件判斷命令
條件判斷命令是與流程控制語句配合使用的命令。
命令格式: test 條件判斷式
返回條件判斷式的值,條件成立返回0,否則返回非0值。
通常使用的格式代替test命令,注意條件判斷式與必須有空格分開。
參與判斷的變量必須已初始化且非空。
例如:
條件判斷支持復(fù)合條件判斷:
A、與判斷
使用&&分隔兩條判斷命令。
例如: &&
B、或判斷
使用||分隔兩條判斷命令。
例如: ||
C、非判斷
使用!符號進(jìn)行非判斷。
例如: !

條件判斷式包括數(shù)值判斷、字串判斷、文件判斷和復(fù)合判斷四類操作,分別定義如下:
A、數(shù)值判斷
#判斷n1==n2
#判斷n1>=n2
#判斷n1>n2
#判斷n1<=n2
#判斷n1 #判斷n1!=n2
注意:數(shù)值判斷僅支持整型。

B、字串判斷




#判斷str1長度是否非0
#判斷str1長度是否為0

C、文件判斷
#判斷目錄file是否存在
#判斷file是否存在
#判斷文件file是否存在
#判斷file是否存在并可讀
#判斷file是否存在并非空
#判斷file是否存在并可寫
#判斷file是否存在并可執(zhí)行
#判斷file是否存在并屬于當(dāng)前用戶
#判斷file是否存在且默認(rèn)組于當(dāng)前用戶所屬組是否相同
#判斷file1是否比file2新
#判斷file1是否比file2舊

D、復(fù)合判斷
-a 與操作,例如:
-o 或操作,例如:


條件判斷可以通過(())使用標(biāo)準(zhǔn)數(shù)學(xué)運(yùn)算符進(jìn)行數(shù)值賦值運(yùn)算和判斷。
例如:
test=3
if (($test*3>1));then
echo $test
else
echo $((++test))
fi

條件判斷可以通過]代替test進(jìn)行字串比較,同時還提供了正則匹配功能。注意判斷式和]之間要用空格分隔。且判斷式各元素間不得有空格。
例如:
test="aaabbb123"
if ];then
echo ok
fi

!函數(shù)
1、基本格式
function 函數(shù)名()
{
命令
... ...
}

2、基本用法
關(guān)鍵詞function和函數(shù)名后的括號可以單獨(dú)省略,但不可同時省略。
默認(rèn)以最后執(zhí)行命令的返回值代表函數(shù)的返回碼。可以使用return命令立即結(jié)束函數(shù)執(zhí)行,并以return后指定的值做為返回碼。如果return未指定值,則返回0。
函數(shù)需要在首次調(diào)用前定義,建議在程序最前面定義。
可以將函數(shù)統(tǒng)一定義在單獨(dú)文件中,再以source或. (注意.后面有空格)的形式被其他程序調(diào)用。為了不產(chǎn)生沖突,建議函數(shù)包中定義的函數(shù)名以下劃線開頭。
函數(shù)內(nèi)局部變量應(yīng)以local關(guān)鍵詞定義。
函數(shù)直接以函數(shù)名調(diào)用,如需傳入?yún)?shù)則在函數(shù)名加空格后跟寫,多個參數(shù)以空格分隔。
函數(shù)使用和$n的形式調(diào)用傳入的位置參數(shù),此時主程序的位置參數(shù)不受影響。
例如:
func.sh
#!/bin/bash
_testfunc()
{
if (($1>$2));then
echo "$1 > $2"
elif (($1==$2));then
echo "$1 = $2"
else
echo "$1 < $2"
fi

return 10
}

main.sh
#!/bin/bash
. func.sh
_testfunc 32 24
_testfunc 15 15
_testfunc 1 12

!常用內(nèi)置命令
1、echo
顯示信息,自動換行
echo -n
取消自動換行
echo -e
字串中控制符生效,比如\n
echo顯示的信息如果包含空格則應(yīng)用單引號或雙引號括起來。
用雙引號括起來的內(nèi)容,會對其中的變量取值、運(yùn)算式計(jì)算結(jié)果、獲取命令執(zhí)行結(jié)果、轉(zhuǎn)義符進(jìn)行轉(zhuǎn)義后再輸出。
單引號對括起來內(nèi)容不做任何轉(zhuǎn)換直接輸出。
例如:echo "it's me" #輸出 it's me
test=lykyl;echo '$test' #輸出 $test
如果顯示信息包括變量則獲取變量值后再與字串組合后顯示。
例如:test=lykyl;echo "hello $test" #輸出 hello lykyl
如果確實(shí)要輸出$字符,可以通過轉(zhuǎn)義符或?qū)⒆执脝我柪ㄆ饋怼?
例如:test=lykyl;echo -n 'hello $test';echo "\$test" #輸出 hello $test $test
2、:
回傳0
3、eval
解析字串參數(shù),以命令形式執(zhí)行
4、source
在當(dāng)前shell中執(zhí)行指定shell程序。
例如:source func.sh
6、read
read 變量名
獲取用戶輸入,并將輸入內(nèi)容存入命令后面的變量中。如果不指定變量,則默認(rèn)存入REPLY這個變量中。
read -p '提示信息' 變量名
顯示提示信息后,等待用戶輸入。
read -a 變量名
接受以空格分隔的一組值,存入指定的變量中。
read -r 變量名
read命令默認(rèn)去掉轉(zhuǎn)義字符前面的反斜杠,例如,輸入\n存入變量后只有n。增加-r選項(xiàng)后,read命令將接受轉(zhuǎn)義字符,不做過濾。
read -t 等待時長 變量名
設(shè)置read等待輸入的時長,超時后read將返回一個非零值。
read -s 變量名
隱藏用戶輸入內(nèi)容在屏幕上的回顯。
7、exec
exec 命令
執(zhí)行命令,取代目前shell。
exec < 文件名
轉(zhuǎn)向輸入,將通過標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)的方式變成從指定文件獲取。
8、eval
執(zhí)行命令后面參數(shù)組合成的指令。
例如:
showfile='/etc/passwd'
eval "cat $showfile"
9、expr
返回算術(shù)運(yùn)算式的值,需要注意運(yùn)算式元素間應(yīng)以空格分隔,遇到與系統(tǒng)控制符沖突的操作符要加轉(zhuǎn)義。
例如:
expr 1 + 1
expr 2 \* 3
10、bc
計(jì)算器
可以通過bc使shell script處理浮點(diǎn)運(yùn)算。bc內(nèi)置變量scale控制小數(shù)點(diǎn)后精確位數(shù)。
A、簡單運(yùn)算
通過管道將多個運(yùn)算式以分號分隔后傳給bc,從左至右依次執(zhí)行后將最右側(cè)運(yùn)算式的值輸出。
echo "運(yùn)算式1;運(yùn)算式2;..."|bc
例如:
num=33
var=`echo "scale=3;v=5*$num;v3=v/4;v3+1"|bc`
B、復(fù)雜運(yùn)算
通過內(nèi)聯(lián)輸入重定向進(jìn)行更復(fù)雜運(yùn)算操作。
例如:
num=33
var=`bc <scale=2
v1=15.5
v2=34*v1
v3=$num*v2+3
v1*(v2+v3/2)
EOF
`

!常用系統(tǒng)變量
1、$0
當(dāng)前執(zhí)行的shell script文件名(帶完整路徑)
2、$1 ~ $n
依次存放shell script的命令行參數(shù),數(shù)值大于9時必須要用{}括起來,比如${10}。
命令行參數(shù)可以通過shift命令進(jìn)行位移操作,位置參數(shù)根據(jù)shift命令指定的數(shù)值往前移動,如不指定移動值,則移動1次。例如:
#!/bin/bash
echo "所有入?yún)ⅲ?@"
while shift
do
&& echo $1
done
3、$*
將所有命令行參數(shù)做為一個字符串存入此變量。
4、$@
將所有命令行參數(shù)做為一個字符串?dāng)?shù)組,每個參數(shù)為一個成員變量,存入此變量。
5、$#
命令行參數(shù)的個數(shù)。
6、$?
上一條命令執(zhí)行后的返回碼。
7、$
當(dāng)前執(zhí)行的shell script進(jìn)程編號。
8、$!
上一個后臺程序的進(jìn)程編號。
9、$_
script執(zhí)行時,存放bash的絕對路徑。
bash交互時,存放上一個命令最后一個命令行參數(shù)。
郵件檢測時,存放郵件文件名。
咨詢小瓶科技
咨詢我們
頂部