[精讚] [會員登入]
1282

[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

你可能感興趣的文章

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

安裝git centos/freebsd/windows安裝git

[CSH/TCSH] 使用tcsh SHELL #1 --變數、控制和迴圈 在FREEBSD或LINUX中使用TCSH SHELL,進行一些基本的指令操作。

Vim .vimrc 設定,讓vim更好用 vim 是 unix-like 系統中最常用的編輯器,經由妥善的設定讓vim更好用

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

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

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

[vi/vim] 如何讓 root 帳號的 vim 可以顯示顏色 如何讓 root 帳號的 vim 可以顯示顏色

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

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

我有話要說


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

訪客留言

[無留言]

隨機好文

HP SAS硬碟leds燈號說明 HP SAS硬碟leds燈號(hp g7/g6系統適用)說明

UTF-8 BOM (Byte Order Mark) 的問題 在 Michael Kaplan 那看到 Every character has a story #4: U+feff

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

海棉寶寶超泡杯演奏的sweet victory 章魚哥和海棉寶寶在超泡杯的演奏歌曲

維修海棉拖把頭 這類型的海棉拖把很好用,可是這近發現海棉頭越來越不耐用,也許是錯覺,以往都能用個三四個月,現在二個月就差不多掉下來。 這