1、第一行寫#!/bin/bash再給腳本加上可執行權限就可以用./name.sh執行,否則需要用sh name.sh來執行腳本
2、-x執行時參數,打印每步執行的命令
3、內建命令:內建命令比外部命令執行的快
type: 用type commandname來查看是否爲內建命令eg:type cd
. 和 source : “.”者“source”可以執行沒有執行權限的腳本eg: . ./hello.sh or source hello.sh
bg fg & jobs:在命令後直接加&命令可以在後臺執行;當一個命令已經開始執行,用Ctrl+z將命令暫停,在用jobs查看暫停命令的編號,再用bg number 來將命令後臺執行;用fg number可將後臺的命令調至前臺執行。
echo:打印一行字符,用-n參數可也不打印換行符,-e參數可也識別打印轉義字符。echo對引號不敏感,但是使用轉義字符時最好加上雙引號。
eval:執行參數中的命令。eg: name1=a name2=b eval $name1=”$name2” echo $a b
exec:執行當前命令,完成後退出shell
export:使父shell的變量在子shell中可見。
let:整數運算命令, eg:let i=2+2 let i++
pwd:輸出工作目錄,-P參數可以輸出鏈接的源目錄;$OLDPWD上次工作目錄local:局部變量,常用於函數體內
read:從標準輸入讀入一行變量,-p參數可以輸出提示;默認保存在REPLY變量中,也可以指定變量名。
return:從函數中返回,後接一個整數n。
shift:將所有參數左移一個單位;
test:測試表達式,成功返回1否則返回0。
exit: 退出當前shell,後接一個返回值。該值有相關規定。
4、變量
變量的定義:變量名=“變量值” 變量名大小寫敏感,等號兩側不能有空格,無引號、單引號、雙引號不敏感。但加雙引號是安全的方法。
變量的引用:${name}花括號不敏感,但加花括號是安全的方法。
變量的位置不敏感,但可以用“shopt -s -o nounset”設置爲必須先聲明後引用。
取消變量(函數):unset name
特殊變量:$0~$N,分別表示shell名以及後面的參數,參數從$1開始,$#表示參數的個數N,不包含$0;$@和$*表示所有的參數$1~$N。當N>=10是需要用${N}來引用。$?上一個命令的返回值(linux中規定正常退出的命令和腳本應該以0作爲返回值)。$!最後一個後臺進程的ID號。
只讀變量:readomly name=100
作用域:本shell內,包括子shell和函數內。可以用local來指定函數內的局部變量。
shopt -s -o nounset :設置變量先聲明後引用
5、數組(只支持一維數組)
數組定義:declare -a array array[0]=0 array[1]=”hello”
declare -a name=(“john” “use”) name[2]='wang'
name=(“love” “world”)
score=([1]=1[3]=3 [9]=0)
數組取值:${name[index]}
${name[@]}取出所有元素以空格分隔
${name[*]}取出所有元素不分隔(一個整字符串)
${#name[$]}${#name[*]}數組元素個數;${#name[index]}該元素的長度
${name[@]:from:to}取出從from到to的元素;${name[index]:from:to}取出該元素的相應值
${arraya[@] arrayb[@]}數組連接
array=(${array[@]/world/tomorrow})將數組中值爲world的元素的值替換爲tomorrow
數組取消:unset array unset array[index]
6、引用
雙引號:引號內的特殊字符會被解釋成特殊字符
單引號:引號內的特殊字符不會被解釋爲特殊字符,當做普通字符對待。
反引號:執行命令,於$(command)效果相同,但是$(command)支持嵌套。
7、計算
簡單計算:$[]或者 $(()) echo $[1-0] echo $((5**2))值爲25
賦值計算:let “value=~8” 或者 declare -i var var=1+1此時var的值爲2,參數i表示整數,不能省略。或者用expr,可以計算加減乘除,但操作數和操作符之間要有空格。
其他使用bc
8、花括號
變量擴展:${#name}變量name的長度
${!name*} ${!name@}匹配name開頭的字符
file_{A,B}匹配file_A和file_B
排列組合:echo {x1,x2,x3}{y1,y2,y3}結果爲x1y1 x1y2 x1y3 x2y1 x2y2x2y3 x3y1 x3y2 x3y3
string=abcdcba
替換:newstring=${string/a/b} #將$string中第一個匹配到的a替換爲b,支持轉義字符。結果bbcdcba
newstring=${strint//a/b}#將$string中所有a替換爲b,支持轉義字符。結果bbcdcbb
刪除:#:從左邊開始最短匹配。 newstring=${string#*c} # 結果dcba
##:從左邊開始最長匹配。 newstring=${string##*c} # 結果ba
% :從右邊開始最短匹配。 newstring=${string%c*} # 結果 abcd
%%:從右邊開始最長匹配。 newstring=${string%%c*} # 結果ab
9、測試 test expression 或者 [ expression ]文件測試:test operation file 或者 [ operation file ]
-d -l -p 是目錄、連接、管道文件則返回真
-e文件存在則返回真
-f普通文件則返回真
-x -w -r可執行、可寫、可讀文件則返回真
file1 -nt file2 如果 file1 比 file2新則返回真
file1 -ot file2 如果file1比file2舊則返回真
字符串測試:-z爲空時返回真 -n飛空時返回真
= != > <用於比較兩個字符串
在字符串比較中有些需要對操作符轉義,但使用 [[ ]] 則不需要,[[中間沒有空格。
整數比較: -eq -gt -lt -ge -le -ne 等於 大於 小於 大於等於 小於等於 不等於
邏輯運算:! -a -o或者 ! && ||
10、條件 if elif else
if expression1 ; then
command1
elif expression2 ; then
command1
…
else
command
fi
11、分支 case
case VAR in
var1) command1 ;;
var2) command2 ;;
…
*) command ;;
esac
注:;; 是一個符號,中間沒有空格
12、循環 for while until select
for循環:帶列表(若不帶列表則默認列表爲$@)
for VARIABLE in (list)
do
command
done
類C循環
for (( expression1;expression2; expression3))
do
command
done
while循環:語法
while expression
do
command
done
典例(按行讀取文件)
while read LINE
do
command
done < finename
注:until循環於while循環相似,只是條件相反
select循環:自動將列表中的元素生產數字索引,並等等用戶輸入,如果不輸入則一直等待。
Select MENU in (list)
do
command
done
注:用戶輸入的是數字
break和 continue:後面可以接數字,表示跳出循環的層數。
13、函數:語法
function functionname()
{
commands
return 0
}
調用:functionname [parm1 parm2 ...]
注:function關鍵字可以省略,return可以省略,通常正確執行的返回0,返回值只標明函數正確執行與否,echo可以實現c中的“返回值"
return 的取值範圍是0-255,0位true,其他均爲false,該值不輸出到標準輸出,故不可以給變量賦值。該值值保存在$?中。
參數的使用同於腳本操作參數方法相同,函數支持遞歸
導入(類似於C中的include),在/etc/init.d/functions有一些庫函數可以使用。
. filename
source filename
14、Here Document:用於在腳本中按行輸入
command << END
(input)
END
注:<< (END)符號 要緊跟在命令後面,不要換行
(END)結束符號要最左對齊,不要加白格。
15、$
取變量並賦值給另一個變量。eg:a=$b c=$((1+1))
15、(),(())
():shell命令塊,與{}相同。eg:(cmd1;cmd2;cmd3)
$():執行shell命令並可以賦值變量,與``相同。eg:a=$(ls)
a=(1 2 3):數組賦值
(())執行C語言運算塊。eg:((a++)),((2+3)),((a>1)),((i=0;i<5;i++))
$(()):執行運算並賦值。eg:a=((5+5))
16、[],[[ ]]
[]:test或者正則表達式
a[3]:數組索引
[[ ]]:test,支持變量和轉義字符等
17、{}
{}:代碼塊,與()相同
${name}:變量引用
{}:擴展匹配。eg:ls {a,b}.sh => a.sh b.sh
18、自增
a=1
((a++))
a=$((a+1)),a=$(($a+1))
a=$[a+1],a=$[$a+1]
19、遞歸
function mult()
{
if [ $1 -eq 1 ]; then
echo 1
else
echo $(($1*`mult $(($1-1))`))
fi
}
echo `mult 5`
120
或者
mulLine(){ test $1 -eq 1 && echo 1 || echo $[$1*$(mulLine $[$1-1])]
}
echo $(mulLine 5)
120
# { 後面必須有一個空格,}必須另起一行
20、調用c程序
c程序經過編譯以後就是Linux下一個可執行文件,與普通的shell命令沒有卻別,可以直接調用
如果hello在當前目錄下,則可以在shell中用 ./hello調用
賦值給變量:a=`./hello` # 可以接受stdout的結果,即printf的值。
./是目錄相對尋址,不是執行的語句,也可以直接用絕對地址執行/home/hs/wrokspace/hello來執行
例子
#!/bin/sh
PATH=$PATH:$(pwd)
c=`hello`
echo $c
輸出:Hello World!