shell腳本學習與總結

shell腳本學習總結,東西很多,供初學者參考.

  1. shell腳本是區分大小寫的。

 2.Unix特殊字符有: ( ; $ ? & * () [] ` ‘ “ + 使用其時要進行轉義()

3.Shell的註釋以#開頭

4.函數的定義
Function fuction_name(){

    Command to execute
}

調用時直接用function_name.

5.控制結構

1)If...then語句

If [ test_command ]
    Then
    Commands
fi
2)If...then...else語句
  If [ test_command ]
     Then
     Commands
Else
   commands
fi


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 [email protected] “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 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章