1.shell 指令碼是區分小寫
2.Unix特殊字元有: ( ; $ ? & * () [] ` ‘ “ + 使用其時要進行轉義()
3.Shell的注釋以#開頭
4.函數的定義
Function fuction_name(){
Command to execute
}
調用時直接用function_name.
5.控制結構
1)If...then語句
If [ test_command ]
Then
Commands
if
2)If...then...else語句
If [ test_command ]
Then
Commands
Else
commands
if
3)If...then...elif...then...(else)語句
If [ test_command ]
Then
Commands
Elif [ test_command ]
Then
Commands
Else
Commands
Fi
4)for ... In語句
For loop_varible in argument_list
Do
Commands
done
5)while語句
While test_command_is_true
Do
Commands
Done
6)until 語句
Until test_command_is_true
Do
Commands
Done
7)case語句
Case $variable in
Match_1)
Commands_for_1
Match_2)
Commands_for_2
.
.
.
*) #option for other values
Commands_for_no_match
esac
6.break、continue、exit和return語句
Break跳出整個迴圈體,然後執行迴圈體外接下來的代碼;
Continue 結束本次迴圈,繼續下次迴圈;
Exit 退出整個指令碼,一般在其後加入一個整數(如exit 0),作為傳回碼發送給系統;
Return 用於在函數中返回資料,或返回一個結果給調用函數
7.here文檔
用於將輸入重新導向到某個互動式shell指令碼或程式,而不需要使用者介入。
Program_name << LABLE
Program_input_1
Program_input_2
.
.
Program_input_#
LABLE
注意,程式輸入行中的LABLE標記之間是沒有空白的,且輸入的必須是程式所期望的準確資料,否則可能會失效。
8.符號命令
( ) 在一個子shell中運行括弧所括起來的命令
(( )) 在某個shell中對變數進行求值和賦值,並進行數學運算
$(( )) 對括起來的運算式進行求值
[ ] 與test命令相同
[[ ]] 用於字串比較
$( ) 命令替換
` ` 命令替換
9.命令列參數
命令列參數$0,$1,$2,...,$9是位置參數,$0指向的是命令本身。
命令shift用於位置參數向左移動,如shift命令命令$2成為$1。Shift加入一個數字來移動多個位置,如shift 3使得$4成為$1。shift是一種按照參數列出順序來處理每個位置參數的良好方式。
10.特殊參數
$* 指定所有的命令列參數,與$@的意義一樣。兩者只有在加雙引號時意義不同,如
“$*”將整個參數列表作為一個參數來擷取,”$@”擷取整個參數列表,並將它分隔成不同的參數。
$? 檢查傳回碼。一個成功執行完的命令傳回碼為0,不成功是一個非0值。
11.雙引號,單引號和 `(esc下面的按鍵)
單引號''對內容進行全引用,也就是說,對變數工命令語句使用文字本文,不進行任何替換;而雙引號則進行部分引用,則允許字元替換或命令替換。
`(esc下面的按鍵)用於執行某個命令或指令碼並替換其輸出結果,即命令替換,相同功能有$( )。此外,如果希望每次使用某個變數時重新讀取它的值,也可使用它,如`$PWD`,則每次使用這個變數時都會重新讀取它的新值。
12.檔案許可權和粘滯位(suid,sgid)
檔案許可權有讀,寫,執行三種許可權。將檔案操作模式設為總是作為某個特定的使用者(suid),或總是作為某個特定的群組成員(sgid)來執行稱為設定粘滯位。可以用命令chmod進行修改檔案許可權。
13.在遠程主機上運行命令
Ssh user@hostname command_to_execute
如:ssh jack@192.168.1.3 “uptime”
14.設定陷阱
當某個程式被迫中止時,會有一個退出訊號,這個訊號稱為一個陷阱(trap)。這樣我們可以在捕捉到退出訊號時執行命令,如捕獲到退出訊號1,2,3,15時退出:
Trap `echo “nEXITTING on a TRAPPED SINGAL”; exit` 1 2 3 15
注意不能捕獲到kill -9.的退出訊號。
15.查看使用者資訊
Who 提供每個登入使用者的使用者名稱、tty、登入時間及使用者登入地(IP)
W 對who的擴充,包括作業進程時間,總使用者進程時間等,但沒有使用者登入地資訊。
Last 顯示自wtmp檔案建立開始登入過的使用者名稱單資訊,包括登入時間,退出時間,tty等。
16.ps命令
顯示當前系統進程的資訊。
17.與使用者通訊
Wall,rwall,write,talk
18.大小寫文本
用tr或typeset命令。
VALUES = “AFCDLD”
Echo $VALUES | tr ‘[A-Z]' ‘[a-z]' #將大寫轉換成小寫;tr ‘[a-z]' ‘[A-Z]'則小寫轉換成大寫
或
在VALUES前使用
Typeset -l VALUES #將大寫轉換成小寫;typeset -u 則小寫轉換成大寫。
19.定時運行指令碼cron
Crontab -e進入使用者cron表添加定時指令碼,如
在1月15日星期天0:12執行指令碼/usr/bin/test.sh
#分(0-59) 時(0-23)日(1-31) 月(1-12) 星期(0-6for Sunday-saturday)
12 0 15 1 0 /usr/bin/test.sh
定時任務還可作用at命令。
20.輸出控制
靜默運行,即不輸出任何內容到螢幕上: 2>&1 > /dev/null
輸出到系統指定的控制台: > /dev/console
21.解析命令列參數getopts
Getopts optionstring VARIABLE
Optionstring 是所需的各種參數,用冒號隔開,如果不需要參數,則冒號可以省略。如果optionstring前有一個冒號,則任何未匹配到時會在VARIBLE中載入一個?號
使用getopts的作用是解析出參數,然後作用此參數做不同的操作。如:
While getopts :s:m:h:d:p: TM
Do
Case $TM in
S)
Do something
M)
Do something
.
.
.
?)
Exit 1
Esac
22.逐行處理檔案
While read LINE
Do
Echo “$LINE”
Done <$FILENAME
23.作用select命令建立菜單
Select menu in Yes No Quit
Do
Case $menu in
Yes)
Do something
No)
Do something
Quit)
Break
*)
Do something
Esac
done
shell指令碼學習
1,設定運行環境
在指令碼的頂部寫入:#!/bin/bash2,SHELL中變數與賦值str=hello
linux中變數不需定義,要用時直接賦值使用。如:str,注意等號兩邊不能有空格str=`ls -l /tmp/sh` 如果要把某個命令的執行結果賦給某個變數時,=號右邊要用``括起來
echo "$str"
查看變數的值,此處結果為:hello3,從鍵盤輸入字元或數值賦給指定的變數read name 如:從鍵盤輸入lishi,則name的值為:lishi4,"",'',``雙引號,單引號,倒引號之間區別
echo "my name is $name"
顯示字串,但含有逸出字元引用其變數的值。例中結果:my name is tom
echo 'my name is $name'
把單引號中的內容原樣顯示出來,結果:my name is $name
echo `ls -l`
把倒引號中字元當作命令來執行,並把執行結果顯示出來。5,加,減,乖,除,求模運算。注意要用倒引號括起來
expr `5 + 4`
expr `5 - 4`
expr `5 \* 4`
expr `5 / 4`
expr `5 % 4`
如果是在指令碼裡面進行運算時,倒引號要包括=號右邊全部內容。如:sum=0sum=`expr $sum + 1`6,對文本操作的命令
less 能上下翻
more 能一屏一屏的翻
head 看文本的頭10行 參數-n 5 表示只顯示頭5行
tail 看文本的尾10行,加 -f參數,能即時看記錄檔的變化。如看tomcat記錄檔變化。tail -f /usr/tomcat/logs/canitsl.out
參數-n 5 表示只顯示頭5行7,$?表示上一個命令是否正確執行,0表示正常,1表示錯誤
ls /tmp/hello,如果/tmp/下沒有hello這個檔案或目錄。則$?為1,反之為08,./test lishi wangwu
$0程式名,$1第一個參數的名稱,例中$0為test
$*參數組成的字串,例中$*為lishiwangwu
$#傳遞給程式參數的總數目,例中$#為29,linux中變數分為全域環境變數和使用者組態變數
全域環境變數針對系統中所有使用者而設定的工作環境目錄,在/etc/profile中
使用者組態變數針對某一使用者的。在使用者登入的目錄下,.bash_profile中10,重新導向重新導向就是改變原來輸入輸出的方向,預設都是螢幕輸出裝置,鍵盤是輸入裝置。“>”是輸出重新導向符。“<”是輸入重新導向符。“>”只存放正確的資訊,“2>”存放錯誤的資訊,每次存入前都會把之前檔案內容清空再放入如:ls /usr > /tmp/aaa 把/usr目錄下的所有檔案和檔案夾名稱資訊放到期/tmp/aaa檔案中。
如:ls /test 2> /tmp/aaa 如果沒有/test檔案夾,這時就會發生錯誤,那麼2>就會把錯誤資訊存入aaa檔案中。
“>”能建立新檔案,如:>hello.java
“>”能清空一個檔案 如hello.java檔案中有內容,我再>hello.java這時,hello.java內容清空“>>”雙大於符號在一起就變成了追加功能,在之前的檔案內容後面追加內容。如:cat /tmp/sh >> /tmp/aaa 把/tmp/sh目錄中的所有檔案和目錄資訊追加到aaa檔案中。aaa檔案之前的內容不會被清除。cat > hello.java時,能在螢幕上輸入很多的內容,按ctrl+D時就會退出。再cat hello.java時
剛才輸入的內容,全在hello.java檔案中11,輸入重新導向如:cat > a.txt <<EEE,從螢幕上輸入內容到a.txt中,直到輸入EEE時才結束!!!!像這種結合方式,經常被用在自動執行記錄某些日誌,或者寫入資訊時用到。
SYSPROFILE=/etc/profilecat >> $SYSPROFILE <<EOF
export JAVA_HOME=/usr/java/jsdk
export JAVA_OPTS="-Xms64m -Xmx768m"
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin::$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EOF12,管道管道:把前一個命令的輸出作為下一個命令的輸入。顧名思義就是串連前後兩個管道的作用。
把上一個管道的尾與下一個管道的頭相串連。ls -l /tmp/test | wc -l 統計/tmp/test目錄中共有多少個檔案和目錄。把/tmp/test目錄中檔案和目錄按列顯示。並把顯示出來的結果作為wc -l命令的資訊源。13,條件判斷語句字串比較:=,!=,-n:判斷字串長度是否大於0,大於0則為真,-z:判斷字串長度是否等於0,等於0則為真
數字比較:-eq相等, -ge大於等於,-le小於等於,-ne不等於,-gt大於,-lt小於
邏輯判斷:!非,&&與,||或
檔案判斷:-d目錄判斷,-f檔案判斷,-r可讀,-w可寫,-x可執行test 條件1 比較符 條件2 如:test 1 -eq 1
[ 條件1 比較符 條件2 ] 如:[1 -eq 1 ],[ -n "" ]
[ `who | wc -l` -le 10 ]&& echo "YES" 判斷當前系統的登入使用者數是否小於等於10,是,則輸出YES
16,迴圈語句:
while 條件為真時,執行
do
..
done例:j=1
while((j<=10)) 或者while [ j -le 10 ]
do
echo "j=$j"
j=`expr $j + 1
done if語句:
if
then
else 此處也可elif與fi再嵌套
fi 例:x=4;y=7if [ $x -eq $y ]
then
echo "相等"
else
echo "不相等"
fi case 變數 in
數值1) 語句 ;;
數值2) 語句 ;;
*) 語句 ;; #如果數值不在範圍之中,就執行這一行例:USER=whoamicase $USER in
lishi)
echo "you are LISHI";
echo "Welcome ";;
root)
echo "you are ROOT"
echo "hi root ";;
admin)
echo "you are admin";
echo "admin,hello ";;*)echo "目前使用者不是lishi,root,admin";;
esac for 迴圈例:用FOR迴圈顯示/tmp/sh目錄中的每個檔案資訊。變數i的取值是/tmp/sh目錄中的每個檔案如for i in "a" "b" "c",此時變數i每次迴圈的取值為a,b,cpath=/tmp/sh/
for i in `ls $path`
do
ls -l $i
done例:#用for與if相結合的手法,顯示出從1到鍵盤輸入數之間的偶數
#注意if語句的雙括弧read x
for((i=1;i<=$x;i++))
do
if [ $i % 2 == 0 ]
then
echo "$i"
fi
done14,函數# 定義一個累加的函數sum, 再從鍵盤上輸入兩個數,再調用sum函數
# 注意,函數一定要放在調用該函數的前面sum()
{
a=$x
b=$y
total=`expr $a + $b`
echo "total = $total"
}echo "please enter two number:"
read x
read y
sum $x,$y
shell start:
shell有bsh,bash,cash等
1,在linux中管理使用者登入進去時,提示符為:#,一般使用者登入進去時的提示符為:$
登入進去後,退出或要切換使用者時,用:exit命令,正常退出。
2,查看當前系統中的shell版本,在/etc/shell目錄中查看。
3,在系統中查看不同使用者預設的shell版本,/etc/passwd 查看目前使用者的shell,echo shell
4,直接用命令改變某個使用者的shell環境:chsh 系統使用者名稱,根據提示輸入新shell路經,如:/bin/bash
5,查看目前使用者的環境變數和ID號,set | grep user,set | grep uid 或,查看/etc/passwd檔案
6,查看某個命令在哪個位置 which 命令 如:which ifconfig 當某些一般使用者中有些命令提示無法找到
或執行時,一般是環境變數中沒有把該命令的路經加進來。用export命令設定環境變數
7,查看以前使用過的命令 history history -c清除之前使用過的命令
8,;在shell中用來區分一個命令的結束。一行中可以多個命令
9,調試shell指令碼用. 指令檔名 或 bash 指令檔名
10,檔案許可權分三類:
a,檔案屬主:建立該檔案的使用者
b,同組使用者:擁有該檔案的使用者組中的任何使用者
c,其它使用者:即不屬於擁有該檔案的使用者組的某一使用者
如:-rwxr-xr-x 1 root root 217 08-10 19:51 test1.sh
第一個字元表示檔案的類型,是檔案夾,還是普通檔案 例中-表示普通檔案
後面的9個字元分三段,第一段是檔案屬主的許可權
第二段是同組使用者的許可權,第三段是其它使用者的許可權
賦許可權:g是代表同組使用者,o是代表其它使用者
chmod go+wx ./test.sh 給同組使用者和其它使用者賦寫和執行的許可權
chmod u+wr ./test.sh 給自己賦讀和寫入權限
chmod o+wrx ./test.sh 給其它使用者賦讀,寫和執行的許可權
去許可權與賦許可權同理,只是把“+”換成“-”就可以了
chmod go-rw ./b.c 把同組使用者和其它使用者讀和寫的許可權去除
11,一般許可權也可以用數字表示:4:讀,2:寫,1:執行,
如果用數字給某一個檔案賦許可權,要寫3段數字,如:764,則表示
使用者自己是讀寫執行,同組使用者是讀寫,其它使用者是讀的許可權。
12,給檔案和檔案夾賦許可權時,兩者互不干擾,除非在給檔案夾賦許可權時帶-R參數
那麼,該檔案夾下的所有內容就賦予了和檔案夾一樣的許可權了,小心使用-R
13,查看檔案夾許可權時,用:ll -d /tmp/sh -d是查看檔案夾的,不然只會
列出該檔案夾的內容了。
14,改變檔案的所屬使用者,chown oracle /tmp/sh/api.sh
改變檔案的所屬組,chown :oracle /tmp/sh/api.sh
同時,改變檔案的所屬使用者和組,chown oracle:dba /tmp/sh/api.sh 那麼api.sh的所屬使用者和組資訊為:
-rwxrwxr-x 1 oracle dba 264 07-28 15:57 /tmp/sh/api.sh
15,id 命令,查看當前是哪個使用者,以及哪個組的相當資訊
16,groups 查看系統當前有多少個組,groups 使用者名稱 如:groups oracle,查看使用者所屬組
17,getent group 組名 如:getent group dba 查看dba組中有哪些使用者
18,建立一個使用者並把它加入到指定組中 useradd wangcai -G root
19,當一個指令碼需要以擁有者或組的使用者執行時,需要用到suid,guid
檔案設定了suid或guid時,如果該檔案沒有執行許可權,那麼設定suid或guid時就沒有意思,會用大寫"S"
表示。4代表suid,2代表guid
如:start-orcl.sh 例子,首先用chown改變檔案所屬使用者,再用chmod改變檔案suid和guid的許可權
-rwxr-xr-x 1 root root 632 08-15 17:31 start-orcl.sh
chown oracle start-orcl.sh
-rwxr-xr-x 1 oracle root 632 08-15 17:31 start-orcl.sh
chmod 6751 start-orcl.sh
-rwsr-s--x 1 oracle root 632 08-15 17:31 start-orcl.sh
20,用指定的使用者身份執行一個指令碼 su - oracle -c "/tmp/sh/start-orcl.sh"
以oracle的身份執行start-orcl.sh這個指令碼
21,建立捷徑 ln -s /tmp/sh 1 建立捷徑1指向/tmp/sh,訪問1相當於訪問/tmp/sh一樣。
22,定時任務:
用 service crond status 查看 cron服務狀態,如果沒有啟動則 service crond start啟動它。
基本用法:
crontab -l
列出當前的crontab任務
crontab -d
刪除當前的crontab任務
crontab -e (solaris5.8上面是 crontab -r)
編輯一個crontab任務,ctrl_D結束
crontab filename
crontab的格式為:分 時 日 月 星期 命令(中間用空格隔開)。
crontab檔案的條目是從左邊讀起的,第一列是分,以此類推,最後一列是需要執行的命令。
每一列稱為crontab的一個域,在這些域中,可以用-來串連一個時間範圍,例如星期一到星期五,可以用1-5來表示。
單個時間點可以用,號分隔,比如星期一和星期四,那麼可以表示為1,4。如果某個表示時間的域沒有特別限制,可以用*號表示。每一個時間條目包含5個域,用空格隔開。
比如我希望每天晚上21:30運行bin目錄下的cleanup.sh檔案,那麼該命令就應該為:
30 21 * * * /app/bin/cleanup.sh (注意:由於不需要限定日期、月份、星期,所以日期、月份和星期域用*號表示)
比如我希望每月得1、10、20的00:00運行backup.sh檔案,那麼命令應該為:
00 00 1,10,20 * * /app/bin/backup.sh (注意:由於不需要限定月份和星期,所以月份和星期域用*號表示)
#每兩個小時
0 */2 * * * date
crontab -e 然後在開啟的檔案中編輯內容,如:0 */2 * * * date,儲存退出。
也可以把如: 0 */2 * * * date的內容,放到一個filename檔案中,再用crontab filename
把內容加到crontab中,這時用crontab -l也可以看到filename檔案中的內容。
讓設定檔生效:如果讓設定檔生效,還得重新啟動cron,切記,既然每個使用者下的cron設定檔修改後。
也要重新啟動cron伺服器,/etc/init.d/crond restart 。編輯/etc/crontab檔案,在末尾加上一行: 30 5 * * * root init 6 這樣就將系統配置為了每天早上5點30自動重新啟動。
需要將crond設定為系統啟動後自動啟動的服務,可以在/etc/rc.d/rc.local 中,在末尾加上
service crond start
如果還需要在系統啟動十載入其他服務,可以繼續加上其他服務的啟動命令。
比如: service mysqld start
shell指令碼學習小結
1.字元截斷:
如果是一般路徑的字元截斷可以用basename 和dirname 這兩個工具:
basename 可以從一個檔案路徑中截一個檔案名稱
例如:
$ basename /home/file.tar
file.tar
dirname 可以從一個檔案路徑中截到一個目錄路徑
例如:
$ dirname /home/file.tar
/home
不使用外部工具進行字元截斷
bash 有內建的功能來對變數進行字元截斷,一般使用"##","#","%%","%","*" 組
合來實現。例如:
複製代碼 代碼如下:$ string=hellowbashshell
$ echo ${string##*sh}
ell
$ echo ${string#*sh}
shell
$ echo ${string%%sh*}
hellowba
----------------------- Page 2-----------------------
$ echo ${string%sh*}
hellowbash
"#"表示從字元開始部分除去,一旦匹配則立即除去
"##"表示從字元開始部分除去,會搜整個字串最長的和的匹配來除去
"%"表示從字元結束的部分除去,一旦匹配成公則立即除去
"%%"表示從字元結束的部分開始除去,會搜尋整個字元穿中最長的匹配來除去
"*"統配符,一般與“##”或"#"聯用時放在搜尋字串的左邊,例如:${String#*sh}(在sh 的左
邊),與"%%"或"%"聯用時會放在匹配字串的右邊,例如:${String%%sh*}
常用技巧:
在路徑中取檔案名稱:${path##*/} (與basename 相同功能)
在路徑中取目錄路徑:${path%/*}(與dirname 相同功能)
取檔案的副檔名:${path##*.}
2. 自變數的接收
接收來自命令列傳入的參數,第一個參數用$1 表示,第二個參數$2 表示,。。。以此類推。
注意:$0 表示指令檔名。另外一個在shell 編程中經常用到的是“$@”這個代表所有的參
數,。你可以用一個迴圈來遍曆這個參數。如果用java 來類比的話,可以把$@看作是man
函數中定義的那個數組
3.if 語句:
格式:
if [ condition ]
then
action
fi
注意:“if”和“[”之間需要空格,如果你不空格,shell會報告文法錯
誤的。我就被這個浪費了好一陣時間
----------------------- Page 3-----------------------
conditon 測試類型對照表
運算子 描述 樣本
檔案比較子
-e filename 如果filename 存在,則為真 [ -e /var/log/syslog ]
-d filename 如果filename 為目錄,則為真[ -d /tmp/mydir ]
-f filename 如果filename 為常規檔案,則[ -f /usr/bin/grep ]
為真
-L filename 如果filename 為符號連結,則[ -L /usr/bin/grep ]
為真
-r filename 如果filename 可讀,則為真 [ -r /var/log/syslog ]
-w filename 如果filename 可寫,則為真 [ -w /var/mytmp.txt ]
-x filename 如果filename 可執行,則為真[ -L /usr/bin/grep ]
filename1-nt 如果filename1 比filename2 [ /tmp/install/etc/services -nt
filename2 新,則為真 /etc/services ]
filename1-ot 如果filename1 比filename2 [ /boot/bzImage -ot
filename2 舊,則為真 arch/i386/boot/bzImage ]
字串比較運算子 (請注意引號的使用,這是防止空格擾亂代碼的好方法)
-z string 如果string 長度為零,則為真 [ -z "$myvar" ]
-n string 如果string 長度非零,則為真 [ -n "$myvar" ]
string1= string2 如果string1 與string2 相同,[ "$myvar" = "one two three" ]
則為真
string1!= string2 如果string1 與string2 不同,[ "$myvar" != "one two three" ]
則為真
算術比較子
num1-eq num2 等於 [ 3 -eq $mynum ]
num1-ne num2 不等於 [ 3 -ne $mynum ]
num1-lt num2 小於 [ 3 -lt $mynum ]
num1-le num2 小於或等於 [ 3 -le $mynum ]
num1-gt num2 大於 [ 3 -gt $mynum ]
num1-ge num2 大於或等於 [ 3 -ge $mynum ]
感覺bash 中的if 相比其他的一些語言智能多了,在bash 中,測試一個檔案的存在跟比較
兩個數位大小沒有什麼兩樣
----------------------- Page 4-----------------------
4.for 語句
bash 裡的語句總是那麼的人性化,十分的接近自然語言,在for 語句中幾乎可以
迭代任何類似與集合的資料類型(或許這樣個說法不對,但我確實想不到更好的
詞來代替)。
看一個例子:
#!/bin/bash
for args in $@
do
echo $args
done
把上面這段代碼錄入儲存為showargs.sh 設定為可執行(chmod +x showargs.sh)
執行:
$ ./showargs.sh arg1 arg2 arg3 arg4
arg1
arg2
arg3
arg4
這個例子中,我們用到了之“$@”,它代表了所有的命令列參數。在這裡用for
對其進行遍曆,系統迭代地從$@中取出命令列參數把他放到args 中,最後使用
echo $args 進行輸出。
for 更經常用到的是遍曆目錄,下面的例子用於列出目前的目錄下的所有檔案和文
件夾的名稱 複製代碼 代碼如下:$ for file in *
> do
> echo $file
> done
這裡用*代表目前的目錄,列出的是所有的檔案和檔案夾的名稱,在這裡,檔案夾
和檔案你是分不出來的,如果你需要,你應該用if [-d ${file}]來做一下判斷。
----------------------- Page 5-----------------------
對於檔案遍曆,更有趣的是,你可以在 “in” 後面接上多個運算式。也就是說,
你可以一次在遍曆多個目錄。
下面這段代碼能把目前的目錄下go 檔案夾和do 檔案夾裡的檔案複製到fo 檔案夾
下 複製代碼 代碼如下:#!/bin/bash
for args in ./go/* ./do/*
do
cp ${args} ./fo
echo "copying ${args} to ./fo/${args}"
done