數(shù)組
arr=(ele1 ele2 ele3) 元素之間用空格分開
隨機訪問數(shù)組${arr[2]}
訪問整個數(shù)組${arr[]}(for ele in ${arr[]})
unset ${arr[idx]}可以把idx處元素變成空,unset arr則整個數(shù)組為空。
http://zengrong.net/post/1518.htm
輸入重定向
內(nèi)聯(lián)輸入重定向(inline input redirection):
command << marker
data
marker
eg:
wc << EOF
test string 1
EOF
shell的數(shù)學(xué)運算
- expr命令(http://www.computerhope.com/unix/uexpr.htm)
- bash $[ epxr ], e.g $[ 1 + 5 ]
exit code
$?打印上一條命令退出的狀態(tài)碼
0 成功,1位置錯誤,2誤用shell命令,126不可執(zhí)行,127沒找到命令,128無效退出參數(shù),128+x linux信號x的錯誤,130 ctrl+C中止,255 退出狀態(tài)碼越界。
if-then語句
format:
if command
then
command
elif command
then
command
else
command
fi
test命令
test condition,if-then中你可以使用[ condition ](注意方括號兩邊的空格)
可用的比較命令:
數(shù)值比較
-eq -ge -gt -le -lt -ne(not equal)
字符串比較
下面的>和<使用的時候必須轉(zhuǎn)義
= != < > -n(字符串長度是否非0) -z(字符串長度是否為0)
文件比較
- -d 是否存在并且為目錄
- -e 是否存在
- -f 是否存在并且是文件
- -r 是否存在并可讀
- -s 是否存在并非空
- -w 是否存在并可寫
- -x 是否存在并可執(zhí)行
- -O 是否存在并屬于當前用戶
- -G 時候存在并屬于當前組
- file1 -nt file2 file1是否比file2更新
- file1 -ot file2 file1是否比file2更舊
復(fù)合條件
- [ condition1 ] && [ condition2 ]
- [ condition1 ] || [ condition2 ]
圓雙括號
(( expression )),用來做高級數(shù)學(xué)運算。
支持++, --, ~, !, **, <<, >>, &, |, &&, ||
e.g:
val1=10
if (( val1 ** 2 > 90))
then
(( val2 = $val1 ** 2 ))
fi
echo $val2
方雙括號
[[ expression ]],支持用正則匹配字符串
if [[ $USER == r* ]]
case
case $val in
a | b)
command1;;
c)
command2;;
*)
default_command;;
esac
for
for var in list
do
command
done
TIPS:
list append:
list=$list" extra"可以在list后面添加一個元素
修改list分隔符:
list元素之間的分隔符是IFS環(huán)境變量(internal field separator),它定義了bash用來做字段分隔符的一系列字符。默認情況下是空格、tab和換行。
可以通過修改這個環(huán)境變量來達到修改分隔符的目的。這樣list就可以采用各種分隔符。
e.g
IFS=$'\n'
IFS=$'\n:,;' # 指定多個分隔符
C style for
for (( variable assignment; condition; iteration process ))
e.g
for (( i=0; i <10; i++ ))
do
echo $i
done
while
while test command
test command2
...
do
command
done
test command會被依次執(zhí)行,最后一個命令的退出狀態(tài)碼會用來決定是否結(jié)束循環(huán)。
until
until test command
test command2
...
do
command
done
和while類似。
break && continue
break n和continue n表示作用于第n層循環(huán),默認n=1,就是當前循環(huán)。
腳本輸入?yún)?shù)
#$是腳本命令行參數(shù)個數(shù)。${!#}(在花括號里不能使用$,需要使用!)
$*把所有參數(shù)當作一個變量
$@把所有參數(shù)當作一個list,可以遍歷。
shift可以把$i+1參數(shù)移動到$i。
重定向
&>可以同時重定向stderr和stdout。
&1,&2可以把某些輸出單獨定向到stderr或者stdout。
在腳本內(nèi)永久重定向可以exec 1/2>xxx,同理exec 0<input.
實際上,3~8的操作符是保留的,你可以exec 3~8>xxx,也可以exec 3~8<xxx
exec n>&-則表示關(guān)閉文件操作符。
lsof可以看到文件描述符。
臨時文件和臨時文件夾
man mktemp
mktemp youname.XXXXXX
信號
ctrl+c = SIGINT
ctrl+z = SIGSTP
man trap
trap command signal
trap - signal
重啟已經(jīng)停止的進程
bg $job_number
調(diào)整進程優(yōu)先級
nice/renice
函數(shù)
函數(shù)聲明:
function name {
commands
}
或者
name() {
commands
}
老函數(shù)聲明會被新的覆蓋,且不會給出任何提示。
#?或者上一條命令執(zhí)行的狀態(tài)碼,同理在函數(shù)調(diào)用之后,#?可以獲得函數(shù)返回的狀態(tài)碼。
輸入?yún)?shù)
func $var1 $var2...
和腳本輸入一樣,參數(shù)放在$1... $n。同理,#$和#@也可以用。
函數(shù)變量
不在函數(shù)中使用全局變量,可以用local var的方法聲明成局部變量。
數(shù)組和函數(shù)
如果把數(shù)組作為參數(shù)傳入函數(shù),函數(shù)只會取數(shù)組的第一個值。
需要用到#@,同理也可以返回一個數(shù)組。
function test {
local newarray
newarray = `echo "$@"`
echo ${newarray[*]}
}
arr=(1 2 3 4 5)
test ${arr[*]}
source
source會在當前bash的上下文執(zhí)行命令,而不是新開bash。.和source的作用是一樣的。