[CSH/TCSH] 使用tcsh SHELL #1 --變數、控制和迴圈

URL Link //n.sfs.tw/11317

2017-06-15 12:56:14 By 張○○

[CSH/TCSH] 使用tcsh SHELL #1 --變數、控制和迴圈
[CSH/TCSH] 使用tcsh SHELL #2 --檢查、傳值

在FREEBSD上有時會需要使用一些排程或重覆性的指令來完成一些操作,可以藉由SHELL來達成,SHELL有幾種,以下為CSH或TCSH(不適用BASH或SH)

1. 建立一個shell檔

查看目前的shell

$ echo $SHELL
/bin/tcsh

shell檔一般以 .sh作為辨識。建立

$ touch test.sh

修改權限為可執行

$ chmod 711 test.sh

測試,因為這是空檔,所以不會有任何回應

$ ./test.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 = 1
直接設定字串
$ set p = yes
設定唯讀變數
$ set -r p=readonly
設定陣列
$ set poker=(spade heart diamond club)

取值

只要在變數前加上錢字號'$'即可

$ echo $poker[0]
<結果空白>

$ echo $poker
spade heart diamond club

$ echo $poker[1]
spade

注意echo 這個指令後面的參數會直接印出來,可不必加雙引號

$ echo $poker[2] $poker[3]
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=$<

範例

$ set hour=$<
23      <輸入23按ENTER>
$ echo $hour
23

3. 數值運算

在TCSH 中作運算要以 '@' 開頭然後空一格。

$ set p=1
$ @ 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

範例

if ( $p == 4 ) echo 'p is 4'
  ^ ^  ^  ^ ^ ^ 注意空格

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

set x = 1
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

repeat 10 echo '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