[精讚] [會員登入]
29494

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

在FREEBSD或LINUX中使用TCSH SHELL,進行一些基本的指令操作。

分享此文連結 //n.sfs.tw/11317

分享連結 [CSH/TCSH] 使用tcsh SHELL #1 --變數、控制和迴圈@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-25 13:09:58 最後編修
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

END

你可能感興趣的文章

[bc] linux 的計算機 bc 指令列模式、輸出結果到檔案 linux 的計算機 bc 計算結果輸出

[Linux] ls --color 的檔案特徵及顏色意義 ls --color 時看到的檔案特徵及顏色意義及和檔案權限有關的指令

[SSH] 解決 SSH 登入延遲,登入時驗證很慢的問題 登入要等很久,才會跳出輸入密碼的視窗,怎麼解決?

時間和時區CST UTC GMT的說明及設定 時間和時區CST DST UTC GMT的說明設定,及php時間的設置

FREEBSD、LINUX和MAC拷背目錄的差別 原本以為cp複製一個目錄,但在FREEBSD、LINUX和MAC竟有不同的表現情況

[Linux] mongodb 初步--3/3 我使用mongo 的一些大小事:資料庫的權限、幫助

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[Freebsd] 使用 ADSL 撥接上網 Freebsd上要使用 ADSL 撥接上網,該如何設定?

Linux shell 的date表示法 linux下SHELL中的date表示法

好用的3+2碼郵遞區號查詢系統推薦 網路上找到用地址輸入判斷3+2碼郵遞區號的辨識率不高,除了這個網站…

[AS3] 物件加上超連結的方法 物件加上超連結,可讓使用者點擊的方法

兩次使用InnoDB的慘痛經驗 Mysql 的Innodb引擎雖然好用,但是我得說說我兩次的慘痛經驗,這讓我考慮以後可能不會再使用innodb了