1. 程式人生 > >關於shell if控制語句和echo>>到xxx.sh的筆記

關於shell if控制語句和echo>>到xxx.sh的筆記

A.列印時間戳:

date的話你用$()引起來,或者鍵盤左上角那個符號引起來才能執行

echo "time is $(date +%T)!"像這樣

echo ./run_nets.sh $(pwd)/$onchip_temp >> nansong_run_nets.sh

B.shell if語句:

 菜鳥我最近在學習shell指令碼,自己寫了個很簡短的指令碼測試下,一直報錯“syntax error near unexpected token `then' ”。上網google了一圈也沒發現原因。原來我在寫if條件判斷的時候,if後面缺少一個空格

  1. if [ 判斷條件 ]  
在寫if條件判斷的時候,要注意不但if後面需要空格,而且“ [ ” 後面 和“ ] ”前面都需要有空格。有沒有感覺很無語。還有一點需要謹記,在shell指令碼中當使用“ = ”給變數賦值的時候,在 “ = ”兩邊一定不能加空格
,否者會把變數名當作一個命令來執行而報出“ command not found ”的錯誤,但是在if條件判斷的時候,if [ "判斷條件" ] 判斷條件中需要用到比較的時候則“ = ” 或者 " != "的兩邊都需要用空格隔開。另外在寫if判斷的時候,不要忘記then,否者也會有問題。當然elif(相當於else if)是可選的。

      下面再總結一下shell指令碼中,if判斷中的測試選項。

1,關於檔案的判斷

       返回 true 如果...

       -e 檔案存在
       -f file 是一個 regular 檔案(不是目錄或者裝置檔案)
       -s 檔案長度不為 0
       -d 檔案是個目錄
       -b 檔案是個塊裝置(軟盤,cdrom 等等)
       -c 檔案是個字元裝置(鍵盤,modem,音效卡等等)
       -p 檔案是個管道
       -h 檔案是個符號連結
       -L 檔案是個符號連結
       -S 檔案是個 socket
       -t 關聯到一個終端裝置的檔案描述符
           這個選項一般都用來檢測是否在一個給定指令碼中的 stdin[-t0]或[-t1]是一個終端
       -r 檔案具有讀許可權(對於使用者執行這個 test)
       -w 檔案具有寫許可權(對於使用者執行這個 test)
       -x 檔案具有執行許可權(對於使用者執行這個 test)


         -g  set-group-id(sgid)標誌到檔案或目錄上,如果一個目錄具有 sgid 標誌,那麼一個被建立在這個目錄裡的檔案,這個目錄屬於建立這個目錄的使用者組,並不一定與建立這個檔案的使用者的組相同.對於 workgroup 的目錄共享來說,這非常有用.見<<UNIX 環境高階程式設計中文版>>第 58 頁.

         -u  set-user-id(suid)標誌到檔案上如果執行一個具有 root 許可權的檔案,那麼執行程序將取得 root 許可權,即使你是一個普通使用者.[1]這對於需要存取系統硬體的執行操作(比如 pppd 和 cdrecord)非常有用.如果沒有 suid 標誌的話,那麼普通使用者(沒有 root 許可權)將無法執行這種程式.見<<UNIX 環境高階程式設計中文版>>第 58 頁.
-rwsr-xr-t
1 root
178236 Oct 2 2000 /usr/sbin/pppd
對於設定了 suid 的檔案,在它的許可權標誌中有"s".

        -k  設定貼上位,見<<UNIX 環境高階程式設計中文版>>第 65 頁.對於"sticky bit",save-text-mode 標誌是一個檔案許可權的特殊型別.如果設定了這個標誌,那麼這個檔案將被儲存在交換區,為了達到快速存取的目的.如果設定在目錄
中,它將限制寫許可權.對於設定了 sticky bit 位的檔案或目錄,許可權標誌中有"t".
drwxrwxrwt
7 root
1024 May 19 21:26 tmp/
如果一個使用者並不時具有 stick bit 位的目錄的擁有者,但是具有寫許可權,那麼使用者只能在這個目錄下刪除自己所擁有的檔案.這將防止使用者在一個公開的目錄中不慎覆蓋或者刪除別人的檔案,比如/tmp(當然 root 或者是目錄的所有者可以隨便刪除或重新命名其中的檔案).

-O 你是檔案的所有者.
-G 檔案的 group-id 和你的相同.
-N 從檔案最後被閱讀到現在,是否被修改.

       f1 -nt f2     檔案 f1 比 f2 新

       f1 -ot f2     f1 比 f2 老

       f1 -ef f2     f1 和 f2 都硬連線到同一個檔案.

       !                非--反轉上邊測試的結果(如果條件缺席,將返回 true)

2,關於字串的判斷

       str1 = str2       當兩個串有相同內容、長度時為真
       str1 != str2      當串str1和str2不等時為真
       -n str1        當串的長度大於0時為真(串非空)
       -z str1        當串的長度為0時為真(空串)

       str1          當串str1為非空時為真

3,數字的判斷
      int1 -eq int2    兩數相等為真

      int1 -ne int2    兩數不等為真
      int1 -gt int2     int1大於int2為真
      int1 -ge int2    int1大於等於int2為真
      int1 -lt int2      int1小於int2為真
      int1 -le int2     int1小於等於int2為真舉例: if [ $file == onchip* ];then                onchip_temp=$file
a=10 b=20if[ $a == $b ]then echo "a 等於 b"elif[ $a -gt $b ]then echo "a 大於 b"elif[ $a -lt $b ]then echo "a 小於 b"else echo "沒有符合的條件"fi