自動目錄
[CSH/TCSH] 使用tcsh SHELL #1 --變數、控制和迴圈
[CSH/TCSH] 使用tcsh SHELL #2 --檢查、傳值
在FREEBSD上有時會需要使用一些排程或重覆性的指令來完成一些操作,可以藉由SHELL來達成,SHELL有幾種,以下為CSH或TCSH(不適用BASH或SH)
1. 建立一個shell檔
查看目前的shell
/bin/tcsh
shell檔一般以 .sh作為辨識。建立
修改權限為可執行
測試,因為這是空檔,所以不會有任何回應
撰寫 TCSH的shell,test.sh 內容如下:
#!/bin/tcsh
echo "This is tcsh shell"
在test.sh 開始第一行加入 #!/bin/tcsh 以聲明此shell是需要用tcsh來執行,如此才不會出錯。也可以少寫驚嘆號'!' #/bin/tcsh 這樣。
一切準備就緒,接下來進入撰寫shell的課程
2. 使用變數:設值及取值
設值
變數
set variable_name=value
陣列
set array_name=( value1 value2 value3 value4 )
1 變數不能以數字做為開頭。
2 '=' 的左右兩邊不得有空格,或是左右各空一格,不可一邊空一邊不空。
3 變數都是字串型態,不必加雙引號。
4 變數前不要加上錢字號'$'
範例
$ set p = 1
直接設定字串
$ set p = yes
設定唯讀變數
$ set -r p=readonly
設定陣列
$ set poker=(spade heart diamond club)
取值
只要在變數前加上錢字號'$'即可
<結果空白>
$ echo $poker
spade heart diamond club
spade
注意echo 這個指令後面的參數會直接印出來,可不必加雙引號
heart diamond
$ echo $poker[4] is black prune tree
club is black prune tree
echo 後用單引號,變數不會被看成變數
$ echo '$poker[4] is black prune tree'
$poker[4] is black prune tree
使用雙引號
$ echo "$poker[4] is black prune tree"
club is black prune tree
使用者自行讀入變數內容
語法
set name=$<
範例
23 <輸入23按ENTER>
$ echo $hour
23
3. 數值運算
在TCSH 中作運算要以 '@' 開頭然後空一格。
$ @ p=$p + 1
^ ^ ^ <== 這些地方都要空一格,否則會出現 @: Badly formed number. 錯誤
$ echo $p
2
4. 條件判斷
語法
1
if (expr) cmd
2
if (expr) then
cmd(s)
endif
3
if (expr) then
cmd(s)
else
cmd(s)
endif
4
if (expr) then
cmd(s)
else if (expr) then
cmd(s)
else
cmd(s)
endif
範例
^ ^ ^ ^ ^ ^ 注意空格
5. 迴圈和控制
總共有4種迴圈控制:foreach, while, repeat, switch, for
語法
1
foreach var (wordlist)
cmd(s)
break <==跳出迴圈
continue <==跳到迴圈下一個值
end
2
while (expr)
cmd(s)
end
3
repeat count cmd
4
switch (str)
case pattern1:
cmd(s)
breaksw
case pattern2:
cmd(s)
breaksw
default:
cmd(s)
(breaksw)
endsw
5 (NOT FOR TCSH)
for var in arr do
done
範例
ex1 印出1到20
while( $x <= 20)
echo $x
@ x = $x + 1
end
ex2 印出字串
set poker = (heart spade club diamond)
foreach var ($poker)
echo $var
end
ex3 分別建立 heart.txt spade.txt club.txt diamond.txt 四個檔
set poker = (heart spade club diamond)
foreach var ($poker)
touch "$var.txt"
end
ex4 印10次HAHA
ex5 判斷指令所代的參數
#/bin/tcsh
switch ( $1 )
case -a:
case -b:
echo "參數 -a or -b!"
breaksw
case -c :
echo "參數 -c"
breaksw
default:
echo "請設定參數"
endsw
下指令
$ ./i.sh
請設定參數
$ ./i.sh -a
參數 -a or -b!
ex6 使用 seq來取代 for
c語言有 for(ii=1; ii <=21; ii+=2)這類的指令,可用seq來幫忙
foreach x (`seq 1 2 21`)
echo $x
end
ex7 把清單中檔案拷背到目的地
檔案清單 filelist.txt
club.txt
diamond.txt
heart.txt
spade.txt
把這些檔案拷背到 ./newdir 這個目錄
#/bin/tcsh
set fns=`cat filelist.txt`
set ii=0
set dir='./newdir'
foreach onefile ( $fns )
cp $onefile $dir
@ ii=$ii + 1
end
echo "共複製 $ii 個檔"
下一個單元 [CSH/TCSH] 使用tcsh SHELL #2 --檢查、傳值
參考資料
[1] http://www.staff.tugraz.at/reinfried.o.peter/unix/program.html
重編原文 2010-06-10 21:52:21