Shell自己是一個用C語言編寫的程序,它是用戶使用Unix/Linux的橋樑,用戶的大部分工做都是經過Shell完成的。Shell既是一種命令語言,又是一種程序設計語言。做爲命令語言,它交互式地解釋和執行用戶輸入的命令;做爲程序設計語言,它定義了各類變量和參數,並提供了許多在高級語言中才具備的控制結構,包括循環和分支。html
它雖然不是Unix/Linux系統內核的一部分,但它調用了系統核心的大部分功能來執行程序、創建文件並以並行的方式協調各個程序的運行。所以,對於用戶來講,shell是最重要的實用程序,深刻了解和熟練掌握shell的特性極其使用方法,是用好Unix/Linux系統的關鍵。linux
能夠說,shell使用的熟練程度反映了用戶對Unix/Linux使用的熟練程度。ios
注意:單獨地學習 Shell 是沒有意義的,請先參考Unix/Linux入門教程,瞭解 Unix/Linux 基礎。git
Shell有兩種執行命令的方式:github
交互式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。web
批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有不少條命令,讓Shell一次把這些命令執行完,而沒必要一條一條地敲命令。shell
Shell腳本和編程語言很類似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不須要編譯,Shell程序從腳本中一行一行讀取並執行這些命令,至關於一個用戶把腳本中的命令一行一行敲到Shell提示符下執行。express
Shell初學者請注意,在日常應用中,建議不要用 root 賬號運行 Shell 。做爲普通用戶,無論您有意仍是無心,都沒法破壞系統;但若是是 root,那就不一樣了,只要敲幾個字母,就可能致使災難性後果。編程
bash:bash是Linux標準默認的shell,本教程也基於bash講解。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的縮寫,內部命令一共有40個。
Linux使用它做爲默認的shell是由於它有諸如如下的特點:
可使用相似DOS下面的doskey的功能,用方向鍵查閱和快速輸入並修改命令。
自動經過查找匹配的方式給出以某字符串開頭的命令。
包含了自身的幫助功能,你只要在提示符下面鍵入help就能夠獲得相關的幫助。
sh:sh 由Steve Bourne開發,是Bourne Shell的縮寫,sh 是Unix 標準默認的shell。
ash:ash shell 是由Kenneth Almquist編寫的,Linux中佔用系統資源最少的一個小shell,它只包含24個內部命令,於是使用起來很不方便。
csh:csh 是Linux比較大的內核,它由以William Joy爲表明的共計47位做者編成,共有52個內部命令。該shell實際上是指向/bin/tcsh這樣的一個shell,也就是說,csh其實就是tcsh。
ksh:ksh 是Korn shell的縮寫,由Eric Gisin編寫,共有42條內部命令。該shell最大的優勢是幾乎和商業發行版的ksh徹底兼容,這樣就能夠在不用花錢購買商業版本的狀況下嘗試商業版本的性能了。
注意:bash是 Bourne Again Shell 的縮寫,是linux標準的默認shell ,它基於Bourne shell,吸取了C shell和Korn shell的一些特性。bash徹底兼容sh,也就是說,用sh寫的腳本能夠不加修改的在bash中執行。#!/bin/bash echo "Hello World !"
將上面的代碼保存爲test.sh,並 cd 到相應目錄:
chmod +x ./test.sh #使腳本具備執行權限 ./test.sh #執行腳本
/bin/sh test.sh
/bin/php test.php
#!/bin/bash # Author : mozhiyan # Copyright (c) http://see.xidian.edu.cn/cpp/linux/ # Script follows here: echo "What is your name?" read PERSON echo "Hello, $PERSON"
chmod +x ./test.sh
$./test.sh What is your name? mozhiyan Hello, mozhiyan
variableName="value"
myUrl="http://see.xidian.edu.cn/cpp/linux/" myNum=100
your_name="mozhiyan" echo $your_name echo ${your_name}
for skill in Ada Coffe Action Java do echo "I am good at ${skill}Script" done
skillScript當成一個變量(其值爲空),代碼執行結果就不是咱們指望的樣子了。
推薦給全部變量加上花括號,這是個好的編程習慣。
已定義的變量,能夠被從新定義,如:
myUrl="http://see.xidian.edu.cn/cpp/linux/" echo ${myUrl} myUrl="http://see.xidian.edu.cn/cpp/shell/" echo ${myUrl}
這樣寫是合法的,但注意,第二次賦值的時候不能寫 my
#!/bin/bash myUrl="http://see.xidian.edu.cn/cpp/shell/" readonly myUrl myUrl="http://see.xidian.edu.cn/cpp/danpianji/"
/bin/sh: NAME: This variable is read only.
unset variable_name
#!/bin/sh myUrl="http://see.xidian.edu.cn/cpp/u/xitong/" unset myUrl echo $myUrl
$echo $$
變量 | 含義 |
---|---|
$0 | 當前腳本的文件名 |
$n | 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是1,第二個參數是 |
2。 | |
$# | 傳遞給腳本或函數的參數個數。 |
$* | 傳遞給腳本或函數的全部參數。 |
$@ | 傳遞給腳本或函數的全部參數。被雙引號(" ")包含時,與 $* 稍有不一樣,下面將會講到。 |
$? | 上個命令的退出狀態,或函數的返回值。 |
$$ | 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。 |
運行腳本時傳遞給腳本的參數稱爲命令行參數。命令行參數用 n表示,例如,1 表示第一個參數,$2 表示第二個參數,依次類推。
請看下面的腳本:
#!/bin/bash echo "File Name: $0" echo "First Parameter : $1" echo "First Parameter : $2" echo "Quoted Values: $@" echo "Quoted Values: $*" echo "Total Number of Parameters : $#"
運行結果:
$./test.sh Zara Ali
File Name : ./test.sh First Parameter : Zara Second Parameter : Ali Quoted Values: Zara Ali Quoted Values: Zara Ali Total Number of Parameters : 2
∗和@ 都表示傳遞給函數或腳本的全部參數,不被雙引號(" ")包含時,都以"1""2" … "$n" 的形式輸出全部參數。
可是當它們被雙引號(" ")包含時,"∗"會將所有的參數做爲一個整體,以"1 2…n"的形式輸出全部參數;"@"會將各個參數分開,以"1" "2"…"n" 的形式輸出全部參數。
下面的例子能夠清楚的看到 ∗和
#!/bin/bash echo "\$*=" $* echo "\"\$*\"=" "$*" echo "\$@=" $@ echo "\"\$@\"=" "$@" echo "print each param from \$*" for var in $* do echo "$var" done echo "print each param from \$@" for var in $@ do echo "$var" done echo "print each param from \"\$*\"" for var in "$*" do echo "$var" done echo "print each param from \"\$@\"" for var in "$@" do echo "$var"
$*= a b c d
"$*"= a b c d $@= a b c d "$@"= a b c d print each param from $* a b c d print each param from $@ a b c d print each param from "$*" a b c d print each param from "$@" a b c d
$./test.sh Zara Ali
File Name : ./test.sh First Parameter : Zara Second Parameter : Ali Quoted Values: Zara Ali Quoted Values: Zara Ali Total Number of Parameters : 2 $echo $? 0 $
#!/bin/bash a=10 echo -e "Value of a is $a \n"
Value of a is 10
Value of a is 10\n
轉義字符 | 含義 |
---|---|
\\ | 反斜槓 |
\a | 警報,響鈴 |
\b | 退格(刪除鍵) |
\f | 換頁(FF),將當前位置移到下頁開頭 |
\n | 換行 |
\r | 回車 |
\t | 水平製表符(tab鍵) |
\v | 垂直製表符 |
`command`
#!/bin/bash DATE=`date` echo "Date is $DATE" USERS=`who | wc -l` echo "Logged in user are $USERS" UP=`date ; uptime` echo "Uptime is $UP"
Date is Thu Jul 2 03:59:57 MST 2009 Logged in user are 1 Uptime is Thu Jul 2 03:59:57 MST 2009 03:59:57 up 20 days, 14:03, 1 user, load avg: 0.13, 0.07, 0.15
形式 | 說明 |
---|---|
${var} | 變量原本的值 |
${var:-word} | 若是變量 var 爲空或已被刪除(unset),那麼返回 word,但不改變 var 的值。 |
${var:=word} | 若是變量 var 爲空或已被刪除(unset),那麼返回 word,並將 var 的值設置爲 word。 |
${var:?message} | 若是變量 var 爲空或已被刪除(unset),那麼將消息 message 送到標準錯誤輸出,能夠用來檢測變量 var 是否能夠被正常賦值。 若此替換出如今Shell腳本中,那麼腳本將中止運行。 |
${var:+word} | 若是變量 var 被定義,那麼返回 word,但不改變 var 的值。 |
#!/bin/bash echo ${var:-"Variable is not set"} echo "1 - Value of var is ${var}" echo ${var:="Variable is not set"} echo "2 - Value of var is ${var}" unset var echo ${var:+"This is default value"} echo "3 - Value of var is $var" var="Prefix" echo ${var:+"This is default value"} echo "4 - Value of var is $var" echo ${var:?"Print this message"} echo "5 - Value of var is ${var}"
Variable is not set 1 - Value of var is Variable is not set 2 - Value of var is Variable is not set 3 - Value of var is This is default value 4 - Value of var is Prefix Prefix 5 - Value of var is Prefix
#!/bin/bash val=`expr 2 + 2` echo "Total value : $val"
Total value : 4
#!/bin/sh a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a is equal to b" fi if [ $a != $b ] then echo "a is not equal to b" fi
a + b : 30
a - b : -10 a * b : 200 b / a : 2 b % a : 0 a is not equal to b
運算符 | 說明 | 舉例 |
---|---|---|
+ | 加法 | `expr a+ |
b` 結果爲 30。 | ||
- | 減法 | `expr a− |
b` 結果爲 10。 | ||
* | 乘法 | `expr a\* |
b` 結果爲 200。 | ||
/ | 除法 | `expr b/ |
a` 結果爲 2。 | ||
% | 取餘 | `expr b |
a` 結果爲 0。 | ||
= | 賦值 | a=$b 將把變量 b 的值賦給 a。 |
== | 相等。用於比較兩個數字,相同則返回 true。 | [ a== |
b ] 返回 false。 | ||
!= | 不相等。用於比較兩個數字,不相同則返回 true。 | [ a!= |
b ] 返回 true。 |
注意:條件表達式要放在方括號之間,而且要有空格,例如 [a==b] 是錯誤的,必須寫成 [ a==b ]。
關係運算符只支持數字,不支持字符串,除非字符串的值是數字。
先來看一個關係運算符的例子:
#!/bin/sh a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a is equal to b" else echo "$a -eq $b: a is not equal to b" fi if [ $a -ne $b ] then echo "$a -ne $b: a is not equal to b" else echo "$a -ne $b : a is equal to b" fi if [ $a -gt $b ] then echo "$a -gt $b: a is greater than b" else echo "$a -gt $b: a is not greater than b" fi if [ $a -lt $b ] then echo "$a -lt $b: a is less than b" else echo "$a -lt $b: a is not less than b" fi if [ $a -ge $b ] then echo "$a -ge $b: a is greater or equal to b" else echo "$a -ge $b: a is not greater or equal to b" fi if [ $a -le $b ] then echo "$a -le $b: a is less or equal to b" else echo "$a -le $b: a is not less or equal to b" fi
運行結果:
10 -eq 20: a is not equal to b 10 -ne 20: a is not equal to b 10 -gt 20: a is not greater than b 10 -lt 20: a is less than b 10 -ge 20: a is not greater or equal to b 10 -le 20: a is less or equal to b
運算符 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等返回 true。 | [ a−eq |
b ] 返回 true。 | ||
-ne | 檢測兩個數是否相等,不相等返回 true。 | [ a−ne |
b ] 返回 true。 | ||
-gt | 檢測左邊的數是否大於右邊的,若是是,則返回 true。 | [ a−g |
b ] 返回 false。 | ||
-lt | 檢測左邊的數是否小於右邊的,若是是,則返回 true。 | [ a−lt |
b ] 返回 true。 | ||
-ge | 檢測左邊的數是否大等於右邊的,若是是,則返回 true。 | [ a−g |
b ] 返回 false。 | ||
-le | 檢測左邊的數是否小於等於右邊的,若是是,則返回 true。 | [ a−le |
b ] 返回 true。 |
先來看一個布爾運算符的例子:
#!/bin/sh a=10 b=20 if [ $a != $b ] then echo "$a != $b : a is not equal to b" else echo "$a != $b: a is equal to b" fi if [ $a -lt 100 -a $b -gt 15 ] then echo "$a -lt 100 -a $b -gt 15 : returns true" else echo "$a -lt 100 -a $b -gt 15 : returns false" fi if [ $a -lt 100 -o $b -gt 100 ] then echo "$a -lt 100 -o $b -gt 100 : returns true" else echo "$a -lt 100 -o $b -gt 100 : returns false" fi if [ $a -lt 5 -o $b -gt 100 ] then echo "$a -lt 100 -o $b -gt 100 : returns true" else echo "$a -lt 100 -o $b -gt 100 : returns false" fi
運行結果:
10 != 20 : a is not equal to b 10 -lt 100 -a 20 -gt 15 : returns true 10 -lt 100 -o 20 -gt 100 : returns true 10 -lt 5 -o 20 -gt 100 : returns false
運算符 | 說明 | 舉例 |
---|---|---|
! | 非運算,表達式爲 true 則返回 false,不然返回 true。 | [ ! false ] 返回 true。 |
-o | 或運算,有一個表達式爲 true 則返回 true。 | [ a−lt20−o |
b -gt 100 ] 返回 true。 | ||
-a | 與運算,兩個表達式都爲 true 才返回 true。 | [ a−lt20−a |
b -gt 100 ] 返回 false。 |
先來看一個例子:
#!/bin/sh a="abc" b="efg" if [ $a = $b ] then echo "$a = $b : a is equal to b" else echo "$a = $b: a is not equal to b" fi if [ $a != $b ] then echo "$a != $b : a is not equal to b" else echo "$a != $b: a is equal to b" fi if [ -z $a ] then echo "-z $a : string length is zero" else echo "-z $a : string length is not zero" fi if [ -n $a ] then echo "-n $a : string length is not zero" else echo "-n $a : string length is zero" fi if [ $a ] then echo "$a : string is not empty" else echo "$a : string is empty" fi
運行結果:
abc = efg: a is not equal to b abc != efg : a is not equal to b -z abc : string length is not zero -n abc : string length is not zero abc : string is not empty
運算符 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字符串是否相等,相等返回 true。 | [ a= |
b ] 返回 false。 | ||
!= | 檢測兩個字符串是否相等,不相等返回 true。 | [ a!= |
b ] 返回 true。 | ||
-z | 檢測字符串長度是否爲0,爲0返回 true。 | [ -z $a ] 返回 false。 |
-n | 檢測字符串長度是否爲0,不爲0返回 true。 | [ -z $a ] 返回 true。 |
str | 檢測字符串是否爲空,不爲空返回 true。 | [ $a ] 返回 true。 |
#!/bin/sh file="/var/www/tutorialspoint/unix/test.sh" if [ -r $file ] then echo "File has read access" else echo "File does not have read access" fi if [ -w $file ] then echo "File has write permission" else echo "File does not have write permission" fi if [ -x $file ] then echo "File has execute permission" else echo "File does not have execute permission" fi if [ -f $file ] then echo "File is an ordinary file" else echo "This is sepcial file" fi if [ -d $file ] then echo "File is a directory" else echo "This is not a directory" fi if [ -s $file ] then echo "File size is zero" else echo "File size is not zero" fi if [ -e $file ] then echo "File exists" else echo "File does not exist" fi
File has read access
File has write permission
File has execute permission
File is an ordinary file This is not a directory File size is zero File exists
操做符 | 說明 | 舉例 |
---|---|---|
-b file | 檢測文件是不是塊設備文件,若是是,則返回 true。 | [ -b $file ] 返回 false。 |
-c file | 檢測文件是不是字符設備文件,若是是,則返回 true。 | [ -b $file ] 返回 false。 |
-d file | 檢測文件是不是目錄,若是是,則返回 true。 | [ -d $file ] 返回 false。 |
-f file | 檢測文件是不是普通文件(既不是目錄,也不是設備文件),若是是,則返回 true。 | [ -f $file ] 返回 true。 |
-g file | 檢測文件是否設置了 SGID 位,若是是,則返回 true。 | [ -g $file ] 返回 false。 |
-k file | 檢測文件是否設置了粘着位(Sticky Bit),若是是,則返回 true。 | [ -k $file ] 返回 false。 |
-p file | 檢測文件是不是具名管道,若是是,則返回 true。 | [ -p $file ] 返回 false。 |
-u file | 檢測文件是否設置了 SUID 位,若是是,則返回 true。 | [ -u $file ] 返回 false。 |
-r file | 檢測文件是否可讀,若是是,則返回 true。 | [ -r $file ] 返回 true。 |
-w file | 檢測文件是否可寫,若是是,則返回 true。 | [ -w $file ] 返回 true。 |
-x file | 檢測文件是否可執行,若是是,則返回 true。 | [ -x $file ] 返回 true。 |
-s file | 檢測文件是否爲空(文件大小是否大於0),不爲空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 檢測文件(包括目錄)是否存在,若是是,則返回 true。 | [ -e $file ] 返回 true。 |
#-------------------------------------------- # 這是一個自動打ipa的腳本,基於webfrogs的ipa-build書寫: # https://github.com/webfrogs/xcode_shell/blob/master/ipa-build # 功能:自動爲etao ios app打包,產出物爲14個渠道的ipa包 # 特點:全自動打包,不須要輸入任何參數 #-------------------------------------------- ##### 用戶配置區 開始 ##### # # # 項目根目錄,推薦將此腳本放在項目的根目錄,這裏就不用改了 # 應用名,確保和Xcode裏Product下的target_name.app名字一致 # ##### 用戶配置區 結束 #####
str='this is a string'
your_name='qinjx' str="Hello, I know your are \"$your_name\"! \n"
your_name="qinjx" greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1
string="abcd" echo ${#string} #輸出 4
string="alibaba is a great company" echo ${string:1:4} #輸出liba
string="alibaba is a great company" echo `expr index "$string" is`
array_name=(value0 value1 value2 value3)
array_name=(
value0
value1
value2
value3
)
array_name[0]=value0
array_name[1]=value1 array_name[2]=value2
valuen=${array_name[2]}
#!/bin/sh NAME[0]="Zara" NAME[1]="Qadir" NAME[2]="Mahnaz" NAME[3]="Ayan" NAME[4]="Daisy" echo "First Index: ${NAME[0]}" echo "Second Index: ${NAME[1]}"
$./test.sh
First Index: Zara
Second Index: Qadir
${array_name[*]}
${array_name[@]}
#!/bin/sh NAME[0]="Zara" NAME[1]="Qadir" NAME[2]="Mahnaz" NAME[3]="Ayan" NAME[4]="Daisy" echo "First Method: ${NAME[*]}" echo "Second Method: ${NAME[@]}"
$./test.sh
First Method: Zara Qadir Mahnaz Ayan Daisy
Second Method: Zara Qadir Mahnaz Ayan Daisy
# 取得數組元素的個數 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得數組單個元素的長度 lengthn=${#array_name[n]}
echo arg
echo "\"It is a test\""
"It is a test"
name="OK" echo "$name It is a test"
OK It is a test
mouth=8
echo "${mouth}-1-2009"
8-1-2009
echo "OK!\n" echo "It is a test"
OK!
It is a test
echo "OK!\c" echo "It is a test"
OK!It si a test
echo "It is a test" > myfile
echo '$name\"'
echo `date`
$printf "Hello, Shell\n" Hello, Shell $
printf format-string [arguments...]
# format-string爲雙引號 $ printf "%d %s\n" 1 "abc" 1 abc # 單引號與雙引號效果同樣 $ printf '%d %s\n' 1 "abc" 1 abc # 沒有引號也能夠輸出 $ printf %s abcdef abcdef # 格式只指定了一個參數,但多出的參數仍然會按照該格式輸出,format-string 被重用 $ printf %s abc def abcdef $ printf "%s\n" abc def abc def $ printf "%s %s %s\n" a b c d e f g h i j a b c d e f g h i j # 若是沒有 arguments,那麼 %s 用NULL代替,%d 用 0 代替 $ printf "%s and %d \n" and 0 # 若是以 %d 的格式來顯示字符串,那麼會有警告,提示無效的數字,此時默認置爲 0 $ printf "The first program always prints'%s,%d\n'" Hello Shell -bash: printf: Shell: invalid number The first program always prints 'Hello,0' $
if [ expression ]
then
Statement(s) to be executed if expression is true
fi
若是 expression 返回 true,then 後邊的語句將會被執行;若是返回 false,不會執行任何語句。#!/bin/sh a=10 b=20 if [ $a == $b ] then echo "a is equal to b" fi if [ $a != $b ] then echo "a is not equal to b" fi
a is not equal to b
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi
若是 expression 返回 true,那麼 then 後邊的語句將會被執行;不然,執行 else 後邊的語句。#!/bin/sh a=10 b=20 if [ $a == $b ] then echo "a is equal to b" else echo "a is not equal to b" fi
a is not equal to b
if [ expression 1 ]
then
Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
Statement(s) to be executed if expression 3 is true
else
Statement(s) to be executed if no expression is true
fi
哪個 expression 的值爲 true,就執行哪一個 expression 後面的語句;若是都爲 false,那麼不執行任何語句。#!/bin/sh a=10 b=20 if [ $a == $b ] then echo "a is equal to b" elif [ $a -gt $b ] then echo "a is greater than b" elif [ $a -lt $b ] then echo "a is less than b" else echo "None of the condition met" fi
a is less than b
if ... else 語句也能夠寫成一行,以命令的方式來運行,像這樣:
if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;
num1=$[2*3]
num2=$[1+5] if test $[num1] -eq $[num2] then echo 'The two numbers are equal!' else echo 'The two numbers are not equal!' fi
The two numbers are equal!
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
case工做方式如上所示。取值後面必須爲關鍵字 in,每一模式必須以右括號結束。取值能夠爲變量或常數。匹配發現取值符合某一模式後,其間全部命令開始執行直至 ;;。;; 與其餘語言中的 break 相似,意思是跳到整個 case 語句的最後。echo 'Input a number between 1 to 4' echo 'Your number is:\c' read aNum case $aNum in 1) echo 'You select 1' ;; 2) echo 'You select 2' ;; 3) echo 'You select 3' ;; 4) echo 'You select 4' ;; *) echo 'You do not select a number between 1 to 4' ;; esac
Input a number between 1 to 4
Your number is:3 You select 3
#!/bin/bash option="${1}" case ${option} in -f) FILE="${2}" echo "File name is $FILE" ;; -d) DIR="${2}" echo "Dir name is $DIR" ;; *) echo "`basename ${0}`:usage: [-f file] | [-d directory]" exit 1 # Command to come out of the program with status 1 ;; esac
$./test.sh
test.sh: usage: [ -f filename ] | [ -d directory ] $ ./test.sh -f index.htm $ vi test.sh $ ./test.sh -f index.htm File name is index.htm $ ./test.sh -d unix Dir name is unix $
for 變量 in 列表
do
command1
command2
...
commandN
done
列表是一組值(數字、字符串等)組成的序列,每一個值經過空格分隔。每循環一次,就將列表中的下一個值賦給變量。for loop in 1 2 3 4 5 do echo "The value is: $loop" done
The value is: 1 The value is: 2 The value is: 3 The value is: 4 The value is: 5
for str in 'This is a string' do echo $str done
This is a string
#!/bin/bash for FILE in $HOME/.bash* do echo $FILE done
/root/.bash_history
/root/.bash_logout /root/.bash_profile /root/.bashrc
while command
do
Statement(s) to be executed if command is true
done
命令執行完畢,控制返回循環頂部,從頭開始直至測試條件爲假。COUNTER=0
while [ $COUNTER -lt 5 ] do COUNTER='expr $COUNTER+1' echo $COUNTER done
1 2 3 4 5
echo 'type <CTRL-D> to terminate' echo -n 'enter your most liked film: ' while read FILM do echo "Yeah! great film the $FILM" done
type <CTRL-D> to terminate
enter your most liked film: Sound of Music
Yeah! great film the Sound of Music
until command
do
Statement(s) to be executed until command is true
done
command 通常爲條件表達式,若是返回值爲 false,則繼續執行循環體內的語句,不然跳出循環。#!/bin/bash a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done
0
1
2
3
4
5
6
7
8
9
#!/bin/bash while : do echo -n "Input a number between 1 to 5: " read aNum case $aNum in 1|2|3|4|5) echo "Your number is $aNum!" ;; *) echo "You do not select a number between 1 to 5, game is over!" break ;; esac done
break n
#!/bin/bash for var1 in 1 2 3 do for var2 in 0 5 do if [ $var1 -eq 2 -a $var2 -eq 0 ] then break 2 else echo "$var1 $var2" fi done done
1 0
1 5
#!/bin/bash while : do echo -n "Input a number between 1 to 5: " read aNum case $aNum in 1|2|3|4|5) echo "Your number is $aNum!" ;; *) echo "You do not select a number between 1 to 5!" continue echo "Game is over!" ;; esac done
echo "Game is over!"
#!/bin/bash NUMS="1 2 3 4 5 6 7" for NUM in $NUMS do Q=`expr $NUM % 2` if [ $Q -eq 0 ] then echo "Number is an even number!!" continue fi echo "Found odd number" done
Found odd number
Number is an even number!! Found odd number Number is an even number!! Found odd number Number is an even number!! Found odd number
function_name () {
list of commands
[ return value ]
}
若是你願意,也能夠在函數名前加上關鍵字 function:
function function_name () {
list of commands
[ return value ]
}
函數返回值,能夠顯式增長return語句;若是不加,會將最後一條命令運行結果做爲返回值。#!/bin/bash # Define your function here Hello () { echo "Url is http://see.xidian.edu.cn/cpp/shell/" } # Invoke your function Hello
$./test.sh
Hello World
$
#!/bin/bash funWithReturn(){ echo "The function is to get the sum of two numbers..." echo -n "Input first number: " read aNum echo -n "Input another number: " read anotherNum echo "The two numbers are $aNum and $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn # Capture value returnd by last command ret=$? echo "The sum of two numbers is $ret !"
The function is to get the sum of two numbers... Input first number: 25 Input another number: 50 The two numbers are 25 and 50 ! The sum of two numbers is 75 !
#!/bin/bash # Calling one function from another number_one () { echo "Url_1 is http://see.xidian.edu.cn/cpp/shell/" number_two } number_two () { echo "Url_2 is http://see.xidian.edu.cn/cpp/u/xitong/" } number_one
Url_1 is http://see.xidian.edu.cn/cpp/shell/ Url_2 is http://see.xidian.edu.cn/cpp/u/xitong/
$unset .f function_name
#!/bin/bash funWithParam(){ echo "The value of the first parameter is $1 !" echo "The value of the second parameter is $2 !" echo "The value of the tenth parameter is $10 !" echo "The value of the tenth parameter is ${10} !" echo "The value of the eleventh parameter is ${11} !" echo "The amount of the parameters is $# !" # 參數個數 echo "The string of the parameters is $* !" # 傳遞給函數的全部參數 } funWithParam 1 2 3 4 5 6 7 8 9 34 73
The value of the first parameter is 1 ! The value of the second parameter is 2 ! The value of the tenth parameter is 10 ! The value of the tenth parameter is 34 ! The value of the eleventh parameter is 73 ! The amount of the parameters is 12 ! The string of the parameters is 1 2 3 4 5 6 7 8 9 34 73 !"
特殊變量 | 說明 |
---|---|
$# | 傳遞給函數的參數個數。 |
$* | 顯示全部傳遞給函數的參數。 |
$@ | 與$*相同,可是略有區別,請查看Shell特殊變量。 |
$? | 函數的返回值。 |
$ command > file
$ who > users
$ cat users
oko tty01 Sep 12 07:30 ai tty15 Sep 12 13:32 ruth tty21 Sep 12 10:10 pat tty24 Sep 12 13:07 steve tty25 Sep 12 13:03 $
$ echo line 1 > users
$ cat users
line 1 $
$ echo line 2 >> users
$ cat users
line 1 line 2 $
command < file
$ wc -l users
2 users $
$ wc -l < users
2 $
$command 2 > file
$command 2 >> file
$command > file 2>&1
$command >> file 2>&1
$command < file1 >file2
命令 | 說明 |
---|---|
command > file | 將輸出重定向到 file。 |
command < file | 將輸入重定向到 file。 |
command >> file | 將輸出以追加的方式重定向到 file。 |
n > file | 將文件描述符爲 n 的文件重定向到 file。 |
n >> file | 將文件描述符爲 n 的文件以追加的方式重定向到 file。 |
n >& m | 將輸出文件 m 和 n 合併。 |
n <& m | 將輸入文件 m 和 n 合併。 |
<< tag | 將開始標記 tag 和結束標記 tag 之間的內容做爲輸入。 |
$wc -l << EOF
This is a simple lookup program for good (and bad) restaurants in Cape Town. EOF 3 $
#!/bin/bash cat << EOF This is a simple lookup program for good (and bad) restaurants in Cape Town. EOF
This is a simple lookup program for good (and bad) restaurants in Cape Town.
#!/bin/sh filename=test.txt vi $filename <<EndOfCommands i This file was created automatically from a shell script ^[ ZZ EndOfCommands
$ sh test.sh
Vim: Warning: Input is not from a terminal $
$ cat test.txt
This file was created automatically from a shell script $
$ command > /dev/null
$ command > /dev/null 2>&1
. filename
source filename
url="http://see.xidian.edu.cn/cpp/view/2738.html"
#!/bin/bash . ./subscript.sh echo $url
$chomd +x main.sh
./main.sh http://see.xidian.edu.cn/cpp/view/2738.html $