[精讚] [會員登入]
30608

[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

你可能感興趣的文章

伺服器防止 ssh 連線一直斷線 SSH連線預設只要一段時間沒有動作,就被斷線,怎麼解決?

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

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

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

[SSH] 限制登入的帳號或群組 SSH常會遭到駭客的掃描和暴力法破解密碼,就算密碼夠強,我還是希望駭客一點機會也沒有,所以要限制可以登入的使用者和來源

計算檔案數和目錄數 linux/freebsd等系統利用ls來計算檔案數和目錄數、只列出目錄的方法

我有話要說

>>

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

訪客留言

[無留言]

隨機好文

[jQuery] textarea 的取值和給值 HTML 的 TEXTAREA 標籤若要用 jquery 取值,不能使用 .text() 或 .html() ,使用 .

PHP for sphinx 函式庫安裝 PECL/sphinx PHP>= 5.2.2 已經能原生支援 sphinx,可是預設的沒有裝,我們得自己裝才能用

TFTP Server 安裝及使用 讓設備的網路設定檔或是韌體經由TFTP拷備出來,操作的方法

精讚的版面變化 ▓此文僅作為舊文的記錄▓ 這篇文章為了紀念改版完成而撰寫。 原本的部落格是民國97年的作品,那時還是用舊有的技術來寫,很

[CodeIgniter 3] 資料庫的使用方法整理2/2 CI3 承襲 CI2,有很多的builder class可以用,依各人的使用習慣,有人喜歡一堆sql字串,有人喜歡用helper