[精讚] [會員登入]
537

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

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

此文完整連結 http://n.sfs.tw/11317

複製連結 [CSH/TCSH] 使用tcsh SHELL #1 --變數、控制和迴圈@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2017-08-06 01:24:43 最後編修
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

你可能感興趣的文章

[find] 活用 find 指令參數-atime -Btime -ctime -mtime 限制尋找時間 活用 find 指令參數-atime -Btime -ctime -mtime 限制尋找時間

安裝git centos/freebsd/windows安裝git

[CSH/TCSH] 使用tcsh SHELL #2 --檢查、傳值 6. 檔案或目錄的檢查 SHELL 中常會用到檔案或目錄的檢查,一般性的語法是: if [ Operator

[SIP] Kphone安裝記錄 Kphone是2008年當時ipv6剛要推廣時,唯一支援IPv6的公用網路電話,安裝的全記錄..

[find] 活用 find 指令參數-exec 執行找到的結果 在linux/ freebsd 中查找檔案最強的就是 find,他有一個參數相當好用:-exec

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

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

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

[Rsync] Freebsd10+Rsync / Centos7+Rsync Freebsd10 和 Centos7 安裝Rsync

[Linux] 進行字串取代,三種字串取代的方法 使用vi、sed、perl來取代字串

我有話要說


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

訪客留言

[無留言]

隨機好文

一個邏輯的錯誤刪了全部檔案的經驗 今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。

NETCRAFT發現你的網站及作業系統 NETCRAFT可以發現你的網站及作業系統

[CodeIgniter 3] 資料庫的使用方法整理1/2 --Select的使用 [CodeIgniter 3] 資料庫的使用方法整理:Select的使用

讓radio box 或checkbox 好按 在行動裝置下,radio box及checkbox變得很難按得到

[SIP] OPENSER LINUX版本安裝全記錄 [SIP] OPENSER LINUX版本安裝全記錄