第一天 echo test (()) [[]]

目錄

echo printf

test



echo printf

printf命令模仿C程序庫(library)裏的printf()庫程序(library routine)。它幾乎複製了
該函數的所有功能。不過在Shell層級的版本上,會有些差異。由於printf的行爲是由POSIX
標準所定義,因此使用printf的腳本比使用echo移植性好。
如同echo命令,printf命令可以輸出簡單的字符串:
[root@master ~]#printf "Hello, Shell\n"
Hello, Shell
[root@master ~]#
你應該可以馬上發現,最大的不同在於:printf不像echo那樣會自動提供一個換行符號。你必須顯式
地將換行符號指定成\n。

echo -n "Enter your name:"  //參數-n的作用是不換行,echo默認是換行

要使轉義符生效,需加參數-e

在echo命令輸出之後附加換行,可以使用\n選項:
$ cat >echo
#!/bin/bash
echo -e "this echo's 3 new lines\n\n\n"
echo "OK"

$ echo "The log files have all been done" >myfile

$ echo "$LOGNAME carried them out at `date`" >>myfile

$ echo "\"/dev/rmt0"\"
"/dev/rmt0"

事實上,echo 除了 -n options 之外,常用選項還有:
-e :啓用反斜線控制字符的轉換(參考下表)
-E:關閉反斜線控制字符的轉換(預設如此)
-n :取消行末之換行符號(與 -e 選項下的 c 字符同意)

關於 echo 命令所支持的反斜線控制字符如下表:
\a:ALERT / BELL (從系統喇叭送出鈴聲)
\b:BACKSPACE ,也就是向左刪除鍵
\c:取消行末之換行符號
\E:ESCAPE,跳脫鍵
\f:FORMFEED,換頁字符
\n:NEWLINE,換行字符
\r:RETURN,回車鍵
\t:TAB,表格跳位鍵
\v:VERTICAL TAB,垂直表格跳位鍵
:ASCII 八進位編碼(以 x 開首爲十六進制) :反斜線本身

$ echo -e "a\tb\tc\nd\te\tf"
a       b       c
d       e       f

上例運用 \t 來區隔 abc 還有 def ,及用\n 將 def 換至下一行。

例二:

$ echo -e "\141\011\142\011\143\012\144\011\145\011\146"
a       b       c
d       e       f

與例一的結果一樣,只是使用 ASCII 八進位編碼。

例三:

$ echo -e "\x61\x09\x62\x09\x63\x0a\x64\x09\x65\x09\x66"
a       b       c
d       e       f

與例二差不多,只是這次換用 ASCII 十六進制編碼。

測試變量是否已經設置
有時要測試是否已設置或初始化變量。如果未設置或初始化,就可以使用另一值。此命令格式爲:
$ { v a r i a b l e : - v a l u e }
意即如果設置了變量值,則使用它,如果未設置,則取新值。例如:
$ COLOUR=blue
$ echo "The sky is ${COLOR:-grey} today"
The sky is grey today
變量c o l o u r取值b l u e,e c h o打印變量c o l o u r時,首先查看其是否已賦值,如果查到,則使
用該值。變量$COLOR沒有設置,所以會打印後面的grey

上面的例子並沒有將實際值傳給變量,需使用下述命令完成此功能:
$ { v a r i a b l e : = v a l u e }
下面是一個更實用的例子。查詢工資清單應用的運行時間及清單類型。在運行時間及類
型輸入時,敲回車鍵表明用戶並沒有設置兩個變量值,將使用缺省值( 0 3 : 0 0和We e k l y),並
傳入a t命令中以按時啓動作業。
#!/bin/bash
# vartest
echo "what time do you wish start the payroll [03:00]:"
read TIME
echo " process to start at ${TIME:=03:00} OK"
echo "Is it a monthly or weekly run [Weekly]:"
read RUN_TYPE
echo "Run type is ${RUN_TYPE:=Weekly}'
at -f $RUN_TYPE $TIME
在輸入域敲回車鍵,輸出結果如下:
what time do you wish start the payroll [03:00]:

process to start at 03:00 OK
Is it a monthly or weekly run [Weekly]:

Run type is Weekly


test

test是Shell中提供的內置命令,主要用於狀態的檢驗,如果結果爲0,表示成功,否則表示失敗。

需要注意的是test命令不支持Shell中提供的各種通配符,如:

 /> name=stephen  

 /> test $name = [Ss]tephen
 /> echo $?
 1

在Shell中還提供了另外一種用於狀態判斷的方式:` expr `,和test不同的是,該方式中的表達式支持通配符,如:
   /> name=stephen
   /> [[ $name == [Ss]tephen ]]
   /> echo $?

   0
   #在` expression `中,expression可以包含&&(邏輯與)和||(邏輯或)。
   /> [[ $name == [Ss]tephen && $friend == "Jose" ]]
   /> echo $?
   1
   /> shopt -s extglob   #打開Shell的擴展匹配模式。
   /> name=Tommy
   # "[Tt]o+(m)y"的含義爲,以T或t開頭,後面跟着一個o,再跟着一個或者多個m,最後以一個y結尾。
   /> [[ $name == [Tt]o+(m)y ]]
   /> echo $?
   0

   /> help [[ 出現幫助信息,但下面的help ((,卻提示錯誤,後來發現是這樣的,help \(\(
   在Shell中還提供了let命令的判斷方式: (( expr )),該方式的expr部分,和C語言提供的表達式規則一致,如:
   /> x=2
   /> y=3
   /> (( x > 2 ))
   /> echo $?
   1
   /> (( x < 2 ))
   /> echo $?
   0  
   /> (( x == 2 && y == 3 ))
   /> echo $?
   0
   /> (( x > 2 || y < 3 ))
   /> echo $?
   1

-d 目錄  -r 讀  -w 寫  -x 執行  -f 常規文件  -L 符號鏈接

1)判斷表達式
if test  (表達式爲真)
if test !表達式爲假
test 表達式1 –a 表達式2                  兩個表達式都爲真
test 表達式1 –o 表達式2                 兩個表達式有一個爲真
2)判斷字符串
test –n 字符串                                   字符串的長度非零
test –z 字符串                                    字符串的長度爲零
test 字符串1=字符串2                    字符串相等
test 字符串1!=字符串2               字符串不等
3)判斷整數
test 整數1 –eq 整數2                        整數相等
test 整數1 –ge 整數2                        整數1大於等於整數2
test 整數1 –gt 整數2                         整數1大於整數2
test 整數1 –le 整數2                         整數1小於等於整數2
test 整數1 –lt 整數2                          整數1小於整數2
test 整數1 –ne 整數2                        整數1不等於整數2
4)判斷文件
test  File1 –ef  File2                            兩個文件具有同樣的設備號和i結點號
test  File1 –nt  File2                            文件1比文件2 新
test  File1 –ot  File2                            文件1比文件2 舊
test –b File                                           文件存在並且是塊設備文件
test –c File                                           文件存在並且是字符設備文件
test –d File                                           文件存在並且是目錄
test –e File                                           文件存在
test –f File                                            文件存在並且是正規文件
test –g File                                           文件存在並且是設置了組ID
test –G File                                           文件存在並且屬於有效組ID
test –h File                                           文件存在並且是一個符號鏈接(同-L)
test –k File                                           文件存在並且設置了sticky位
test –b File                                           文件存在並且是塊設備文件
test –L File                                           文件存在並且是一個符號鏈接(同-h)
test –o File                                           文件存在並且屬於有效用戶ID
test –p File                                           文件存在並且是一個命名管道
test –r File                                            文件存在並且可讀
test –s File                                           文件存在並且是一個套接字
test –t FD                                             文件描述符是在一個終端打開的
test –u File                                           文件存在並且設置了它的set-user-id位
test –w File                                          文件存在並且可寫
test –x File                                           文件存在並且可執行

test一般有兩種格式,即:
test condition

[ condition ]
使用方括號時,要注意在條件兩邊加上空格。

[root@localhost script]# ll
total 8
-rw-r--r-- 1 root root 1895 Dec 29 20:04 passwd
-rw-r--r-- 1 root root  263 Dec 28 12:12 user
[root@localhost script]# [ -w passwd ]
[root@localhost script]# echo $?
0
[root@localhost script]# test -x passwd
[root@localhost script]# echo $?
1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章