天天看點

Linux編寫腳本nsum求和,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

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.特殊參數

$* 指定所有的指令行參數,與[email protected]的意義一樣。兩者隻有在加雙引号時意義不同,如

“$*”将整個參數清單作為一個參數來擷取,”[email protected]”擷取整個參數清單,并将它分隔成不同的參數。

$? 檢查傳回代碼。一個成功執行完的指令傳回代碼為0,不成功是一個非0值。

11.雙引号,單引号和 `(esc下面的按鍵)

單引号''對内容進行全引用,也就是說,對變量工指令語句使用文字正文,不進行任何替換;而雙引号則進行部分引用,則允許字元替換或指令替換。

`(esc下面的按鍵)用于執行某個指令或腳本并替換其輸出結果,即指令替換,相同功能有$( )。此外,如果希望每次使用某個變量時重新讀取它的值,也可使用它,如`$PWD`,則每次使用這個變量時都會重新讀取它的新值。

12.檔案權限和粘滞位(suid,sgid)

檔案權限有讀,寫,執行三種權限。将檔案操作模式設為總是作為某個特定的使用者(suid),或總是作為某個特定的組成員(sgid)來執行稱為設定粘滞位。可以用指令chmod進行修改檔案權限。

13.在遠端主機上運作指令

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

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 <

SYSPROFILE=/etc/profilecat >> $SYSPROFILE <

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 程式設計中經常用到的是“[email protected]”這個代表所有的參

數,。你可以用一個循環來周遊這個參數。如果用java 來類比的話,可以把[email protected]看作是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 [email protected]

do

echo $args

done

把上面這段代碼錄入儲存為showargs.sh 設定為可執行(chmod +x showargs.sh)

執行:

$ ./showargs.sh arg1 arg2 arg3 arg4

arg1

arg2

arg3

arg4

這個例子中,我們用到了之“[email protected]”,它代表了所有的指令行參數。在這裡用for

對其進行周遊,系統疊代地從[email protected]中取出指令行參數把他放到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