變量
變量
變量引用:$ 和 ${}
命令替換
命令輸出中提取信息衅澈,并將其賦給變量
反引號(hào) 和 $()wu=`命令` 或者 wu =$()
注意:`` 和 $() 與= 不能有空格
echo/讀取:read
echo命令可用單引號(hào)或雙引號(hào)來劃定文本字符串颤诀,便可以正常輸出。
echo -n :文本字符串和命令輸出顯示在同一行中read -p "Enter your age:" name
echo "hello $name"read –p 相當(dāng)于 echo -n 提示作用
read -p "Enter your name: " first last
echo "Checking data for $last, $first…"
-t 指定時(shí)間
-s 隱藏輸入內(nèi)容(可用于輸入密碼)
read 文件內(nèi)容
count=1
cat test | while read line
do
echo "Line $count: $line"
count=$[ $count + 1 ]
done
標(biāo)準(zhǔn)輸入輸出
ls -la t test3 test4 2>text1 1>text
&>test 則正確和錯(cuò)誤輸入到同一個(gè)文件
運(yùn)算符
expr
處理數(shù)學(xué)表達(dá)式
ARG1 | ARG2 如果ARG1既不是null也不是零值竟稳,返回ARG1跋涣;否則返回ARG2
ARG1 & ARG2 如果沒有參數(shù)是null或零值,返回ARG1;否則返回0
ARG1 % ARG2 返回ARG1被ARG2除的算術(shù)余數(shù)
*號(hào)等運(yùn)算符識(shí)別不出 需要 加 \
expr 5 \* 2
整數(shù)運(yùn)算$[ ]
bash shell數(shù)學(xué)運(yùn)算符只支持整數(shù)運(yùn)算
var1=$[1+5]var1=
var * 2]
浮點(diǎn)運(yùn)算 bc
直接輸入bc汇荐,進(jìn)行運(yùn)算
–q 不顯示bash計(jì)算器冗長(zhǎng)的歡迎信息
scale 控制小數(shù)位數(shù)
if結(jié)構(gòu)化語(yǔ)句
If 條件;then
fiIf 條件盆繁;then
else
fiif 條件掀淘;then
elif 條件;then
fi方括號(hào)定義了測(cè)試條件油昂。注意革娄,第一個(gè)方括號(hào)之后和第二個(gè)方括號(hào)之前必須加上一個(gè)空格,否則就會(huì)報(bào)錯(cuò)
if [ condition ]
then
commands
fi
數(shù)值比較
-eq 相等
-ge 大于或等于
-gt 大于
-le 小于或等于
-lt 小于
-ne 不等于
字符串比較
str1 = str2 檢查str1是否和str2相同
str1 != str2 檢查str1是否和str2不同
str1 < str2 檢查str1是否比str2小
str1 > str2 檢查str1是否比str2大
-n str1 檢查str1的長(zhǎng)度是否非0
-z str1 檢查str1的長(zhǎng)度是否0
-o 或 相當(dāng)于 ||
-a 和 相當(dāng)于 &&
文件比較
-d file 檢查file是否存在并是一個(gè)目錄
-f file 檢查file是否存在并是一個(gè)文件
-e file 檢查file是否存在
-s file 檢查file是否存在并非空
-r file 檢查file是否存在并可讀
-w file 檢查file是否存在并可寫
-x file 檢查file是否存在并可執(zhí)行
-O file 檢查file是否存在并屬當(dāng)前用戶所有
-G file 檢查file是否存在并且默認(rèn)組與當(dāng)前用戶相同
file1 -nt file2 檢查file1是否比file2新
file1 -ot file2 檢查file1是否比file2舊
復(fù)合條件測(cè)試
if-then語(yǔ)句允許你使用布爾邏輯來組合測(cè)試秕狰。有兩種布爾運(yùn)算符可用:
? [ condition1 ] && [ condition2 ]
? [ condition1 ] || [ condition2 ]
用于數(shù)學(xué)表達(dá)式的雙括號(hào)
雙括號(hào):比較過程中使用高級(jí)數(shù)學(xué)表達(dá)式
val++ 后增
val-- 后減
++val 先增
--val 先減
! 邏輯求反
~ 位求反
** 冪運(yùn)算
<< 左位移
/>> 右位移
& 位布爾和
| 位布爾或
&& 邏輯和
|| 邏輯或
== 匹配字符
用于高級(jí)字符串處理功能的雙方括號(hào)
雙方括號(hào):針對(duì)字符串比較的高級(jí)特性
采用的標(biāo)準(zhǔn)字符串比較稠腊,具有模式匹配
結(jié)構(gòu)
case
變量和模式是匹配的
通過豎線操作符在一行中分隔出多個(gè)模式模式:Y|y
* 會(huì)捕獲所有與已知模式不匹配的值
shift 移動(dòng)變量
操作命令行參數(shù)
根據(jù)它們的相對(duì)位置來移動(dòng)命令行參數(shù)
默認(rèn)情況下它會(huì)將每個(gè)參數(shù)變量向左移動(dòng)一個(gè)位置
即變量2中,變量
1中鸣哀,而變量$1的值則會(huì)被刪除
#!/bin/bash
echo "The original:$*"
shift 2 #移動(dòng)兩個(gè)位置
echo "The position $1"
雙破折線
雙破折線表示選項(xiàng)列表結(jié)束架忌。在雙破折線之后腳本就可以放心地將剩下的命令行參數(shù)當(dāng)作參數(shù),而不是選項(xiàng)來處理了
#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option" ;;
-b) echo "Found the -b option";;
-c) echo "Found the -c option" ;;
--) shift
break ;;
*) echo "$1 is not an option";;
esac
shift
done
#
count=1
for param in $@
do
echo "Parameter #$count: $param"
count=$[ $count + 1 ]
done
#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
a) echo "print a";;
b) echo "print b";;
--) shift
break;;
*) echo "$1 is not an option";;
esac
shift
done
count=1
for param in $@
do
echo "param #$count: $param"
count=$[ $count + 1 ]
done
在遇到雙破折線時(shí)我衬,腳本用break命令來跳出while循環(huán)叹放。由于過早地跳出了循環(huán),我們需
要再加一條shift命令來將雙破折線移出參數(shù)變量
for
for var in list(遍歷自身定義一系列值)
do
commands
done
處理循環(huán)的輸出
!/bin/bash
for (( a=1;a<10;a++ ))
do
echo "The number is $a"
done > wu.txt
對(duì)循環(huán)的輸出使用管道或進(jìn)行重定向到文件中
更改字段分隔符
bash shell默認(rèn)
空格
制表符
換行符
為分隔符
IF=$ 可以制定分隔符
IF=\ $’\n’ ,只有\(zhòng)n為分隔符
c語(yǔ)言for
for (( i = 1; i <= 10; i++ ))
do
command
done
while
while command
設(shè)置單個(gè)命令
只要測(cè)試條件成立挠羔, while命令就會(huì)不停地循環(huán)執(zhí)行定義好的命令
測(cè)試條件中用到的變量必須修改井仰,否則就會(huì)陷入無限循環(huán)
設(shè)置多個(gè)命令
只有最后一個(gè)測(cè)試命令的退出狀態(tài)碼會(huì)被用來決定什么時(shí)候結(jié)束循環(huán)
until
untile test commands
do
other commands
doneuntil條件成立則不執(zhí)行,條件不成立則執(zhí)行與 while 相反
設(shè)置單個(gè)命令
設(shè)置多個(gè)命令
控制循環(huán)
break
退出任意類型的循環(huán)
跳出當(dāng)前正在執(zhí)行的循環(huán)破加,完全終止整個(gè)循環(huán)break n
n指定了要跳出的循環(huán)層級(jí)
continue
continue命令可以提前中止某次循環(huán)中的命令但并不會(huì)完全終止整個(gè)循環(huán)俱恶。
跳過此次循環(huán)中剩余的命令,但整個(gè)循環(huán)還會(huì)繼續(xù)范舀。
可以在循環(huán)內(nèi)部設(shè)置shell不執(zhí)行命令的條件合是。
continue n
實(shí)例
查找可執(zhí)行文件
這個(gè)腳本使用了兩個(gè)不同的IFS值來解析數(shù)據(jù)。第一個(gè)IFS值解析出/etc/passwd文件中的單獨(dú)
的行锭环。內(nèi)部for循環(huán)接著將IFS的值修改為冒號(hào)聪全,允許你從/etc/passwd的行中解析出單獨(dú)的值。
處理用戶輸入
$0 表示程序名本身
在第9個(gè)變量之后辅辩,你必須在變量數(shù)字周圍加上花括號(hào)难礼,比如/${10}
解決變量$0不顯示就會(huì)使用整個(gè)路徑娃圆。
#!/bin/bash
name=$(basename $0)
echo The script name is:$name
echo This is $0
$# 參數(shù)統(tǒng)計(jì)
判斷命令行上有多少參數(shù)
echo there were $#
抓取所有的數(shù)據(jù)
$* 將這些參數(shù)視為一個(gè)整體
$@ 參數(shù)當(dāng)作同一字符串中的多個(gè)獨(dú)立的單詞
#!/bin/bash
count=1
for param in "$*"
do
echo "\$* is #$count=$param"
count=$[ $count + 1 ]
done
for param in "$@"
do
echo "\$@ is #$count=$param"
count=$[ $count + 1 ]
done
${!#}
沒有任何參數(shù)時(shí), $#的值為0蛾茉,
${!#}變量會(huì)返回命令行用到的腳本名
帶參數(shù)時(shí)讼呢,顯示數(shù)量相當(dāng)于 !#
#!/bin/bash
num=$#
echo The num is $num
echo The "!#" is ${!#}
$$ $?
顯示當(dāng)前進(jìn)程
上個(gè)命令的退出狀態(tài)
函數(shù)
創(chuàng)建函數(shù)
有兩種格式
一
function name {
commands
}二
name() {
commands
}
name函數(shù)的唯一名稱吝岭,若定義名字一樣則后續(xù)會(huì)替換第一個(gè)
commands函數(shù)中出現(xiàn)的順序依次執(zhí)行
注:
name 和 { 要有空格,否則出錯(cuò)
#!/bin/bash
function wu {
echo "This my first function"
}
count=1
while [ $count -le 3 ]
do
wu
count=$[ $count + 1 ]
done
wu
function wu {
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ];then
value=$(wu $1 $2)
echo "The result is $value"
else
echo "uage:file a b"
fi
前面的$1h和$2和腳本主體中的$1和$2變量并不相同
要在函數(shù)中使用這些值吧寺,必須在調(diào)用函數(shù)時(shí)手動(dòng)將它們傳過去窜管。
return
函數(shù)的退出狀態(tài)碼是函數(shù)中最后一條命令返回的退出狀態(tài)碼:$?
但是無法知道其他命令中是否成功運(yùn)行
return命令來退出函數(shù)并返回特定的退出狀態(tài)碼(整數(shù)值0~255,大于則會(huì)出錯(cuò))
function wu {
read -p "Enter a value: " value
return $[ $value * 2 ]
}
注意:
函數(shù)一結(jié)束就取返回值
退出狀態(tài)碼必須是0~255
break
退出函數(shù)并返回特定的退出狀態(tài)碼
跳出循環(huán)體稚机,該循環(huán)體已結(jié)束
contiune
中斷循環(huán)中的迭代幕帆,若有指定的條件則繼續(xù)循環(huán)下一個(gè)迭代
循環(huán)沒有結(jié)束
局部變量
函數(shù)內(nèi)部使用的任何變量都可以被聲明成局部變量
局部變量:在變量聲明的前面加上local關(guān)鍵
function wu {
local temp=$[ $value + 5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
wu
echo "The result is $result"
if [ $temp -gt $value ];then
echo "temp is larger"
else
echo "temp is smaller"
fi
數(shù)組
如果你試圖將該數(shù)組變量作為函數(shù)參數(shù),函數(shù)只會(huì)取數(shù)組變量的第一個(gè)值赖条。
將該數(shù)組變量的值分解成單個(gè)的值失乾,然后將這些值作為函數(shù)參數(shù)使用。
在函數(shù)內(nèi)部纬乍,可以將所有的參數(shù)重新組合成一個(gè)新的變量碱茁。
#!/bin/bash
function testit {[圖片上傳中...(5.png-438497-1538820881421-0)]
local newarray=`echo "$@"`
echo "The new array value is: ${newarray[*]}"
}
myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}