041-bash下: () {} [] [[]] (())的解釋

bash下有不少像{}、[]等一些符號命令,下面是我對一些經常使用的符號命令的學習筆記,如有錯誤或紕漏望各位兄弟指正。

1、.(source)
.(點)與source命令同樣,從文件中讀取並執行命令,不管該文件是否都有可執行權限都可以正確的執行。且是在當前shell下執行,而不是產生一個子shell來執行(咱們一般使用「./filename.sh」去執行一個文件是在當前shell下產生一個子shell去執行的)。因此在設置bash的環境的變量時,就必須用該命令或者source命令去執行設置的環境變量纔會對當前shell生效,以下:
 shell

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . $i
    fi
done
bash


2、:
: 該命令什麼都不作,但執行後會返回一個正確的退出代碼,即exit 0。好比在if語句中,then後面不想作任何操做,可是又不能空着,這時就可使用「:」來解決,以下:
 app

if [ "$i" -ne 1 ];then
    :
else
    echo "$i is not equal 1"
fi
less


3、()
() 將多個命令組合在一塊兒執行,至關於一個命令組。

4、{}
{}  和()相似,也是將多個命令組合在一塊兒。它們之間的區別是,()是在產生的子shell下執行,而{}是在當前的shell下執行。這與前面講到是使用".  filename.sh"和"./filename.sh"的區別同樣。舉一個很簡單的例子:
 學習

# A=123
 
(A=abc;echo $A);echo $A
abc
123

# { A=abc;echo $A; };echo $A
abc
abc
測試


從上面的示例能夠看出,當在()中賦值的變量,影響的只是自身的子shell,而不能將該值賦給父shell,由於「父親不能繼承兒子」。而在{}中賦值的變量,由於就在當前的shell執行的,因此就能改變原來變量的值。
注意:()裏面兩邊能夠不使用空格,{}裏面兩邊必須使用空格,且最後一個命令也須要以「;」結尾,表示命令結束。

5、[](test)
[] 與test命令同樣,用於比較值以及檢查文件類型。以下:
一、[ "$A" = 123 ]:是字符串的測試,以測試 $A 是否爲 一、二、3 這三個連續的"文字"。
二、[ "$A" -eq 123 ]:是整數的測試,以測試 $A 是否等於"一百二十三"。
三、[ -e "$A" ]:是關於文件的測試,以測試 123 這份"文件"是否存在。

6、[[]]
[[]]能夠說是[]的「加強版」,它可以將多個test命令支持的測試組合起來,例如:
 spa

# [[ (-d "$HOME") && (-w "$HOME") ]] && echo echo "home is a writable directory"  code

home is a writable directory繼承


至於這二者的區別有位仁兄已經寫的很清楚了,我將其整理一下:
 進程

數字測試: -eq -ne -lt -le -gt -ge,[[ ]]同 [ ]一致
文件測試: -r、-l、-w、-x、-f、-d、-s、-nt、-ot,[[ ]]同 [ ]一致
字符串測試: > < =(同==) != -n -z,不可以使用「<=」和「>=」,[[ ]]同 [ ]
<

SPAN style="COLOR: rgb(0,1,2)">一致,但在[]中,>和<必須使用\進行轉義,即\>和\<
邏輯測試: []爲 -a -o ! [[ ]] 爲&& || !
數學運算: [] 不可使用 [[ ]]可使用+ - */ %
組合: 都可用各自邏輯符號鏈接的數字(運算)測試、文件測試、字符測試


拿這二者對字符串的測試舉一個例子,以下:
 

# [ a \> 1 ] && echo ture || echo false
ture
# [[ a > 1 ]] && echo ture || echo false
ture


字符串的比較是根據相應的ASCII碼來比較的,因此a>1是成立的。若是有興趣也能夠思考一下爲何會出現下面的結果?
 

# [[ a > 1 ]] && echo ture || echo false
ture


7、(())
(())專門來作數值運算,若是表達式求值爲 0,則設置退出狀態爲 1;若是求值爲非 0 值,則設置爲 0。不須要對 (( 和 )) 之間的操做符轉義。算術只對整數進行。除 0 會產生錯誤,但不會產生溢出。能夠執行 C 語言中常見的算術、邏輯和位操做。以下:
 

# ((i=1+99));echo $i
100


也能:
 

# i=99;((i++));echo $i
100


除此以外,也可使用$(())直接進行數值運算,以下:
 

# echo $((2**3))
8


注意:使用 (( )) 時,不須要空格分隔各值和運算符,使用[]和[[ ]] 時須要用空格分隔各值和運算符。 
  
  
組合判斷: 
  
if [ $a -ne 0 ] && [ $b -lt 3 ] || [ $c -gt 5 ] 
then 
#你在這裏加其餘操做 
fi 
  
  
////////////////////////// 
  
7.1.1.1. 和if使用的表達式 下表包含了一個組成 TEST-COMMAND 命令或者命令列表,稱做 「要素primaries」 的概覽。這些primaries放置在方括號中來表示一個條件表達式的測試。 表 7.1. 主表達式Primary 意義
[ -a FILE ] 若是 FILE 存在則爲真。
[ -b FILE ] 若是 FILE 存在且是一個塊特殊文件則爲真。
[ -c FILE ] 若是 FILE 存在且是一個字特殊文件則爲真。
[ -d FILE ] 若是 FILE 存在且是一個目錄則爲真。
[ -e FILE ] 若是 FILE 存在則爲真。
[ -f FILE ] 若是 FILE 存在且是一個普通文件則爲真。
[ -g FILE ] 若是 FILE 存在且已經設置了SGID則爲真。
[ -h FILE ] 若是 FILE 存在且是一個符號鏈接則爲真。
[ -k FILE ] 若是 FILE 存在且已經設置了粘制位則爲真。
[ -p FILE ] 若是 FILE 存在且是一個名字管道(F若是O)則爲真。
[ -r FILE ] 若是 FILE 存在且是可讀的則爲真。
[ -s FILE ] 若是 FILE 存在且大小不爲0則爲真。
[ -t FD ] 若是文件描述符 FD 打開且指向一個終端則爲真。
[ -u FILE ] 若是 FILE 存在且設置了SUID (set user ID)則爲真。
[ -w FILE ] 若是 FILE 若是 FILE 存在且是可寫的則爲真。
[ -x FILE ] 若是 FILE 存在且是可執行的則爲真。
[ -O FILE ] 若是 FILE 存在且屬有效用戶ID則爲真。
[ -G FILE ] 若是 FILE 存在且屬有效用戶組則爲真。
[ -L FILE ] 若是 FILE 存在且是一個符號鏈接則爲真。
[ -N FILE ] 若是 FILE 存在 and has been mod若是ied since it was last read則爲真。
[ -S FILE ] 若是 FILE 存在且是一個套接字則爲真。
[ FILE1 -nt FILE2 ] 若是 FILE1 has been changed more recently than FILE2, or 若是 FILE1FILE2 does not則爲真。
exists and [ FILE1 -ot FILE2 ] 若是 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在則爲真。
[ FILE1 -ef FILE2 ] 若是 FILE1 和 FILE2 指向相同的設備和節點號則爲真。
[ -o OPTIONNAME ] 若是 shell選項 「OPTIONNAME」 開啓則爲真。
[ -z STRING ] 「STRING」 的長度爲零則爲真。
[ -n STRING ] or [ STRING ] 「STRING」 的長度爲非零 non-zero則爲真。
[ STRING1 == STRING2 ] 若是2個字符串相同。 「=」 may be used instead of 「==」 for strict POSIX compliance則爲真。
[ STRING1 != STRING2 ] 若是字符串不相等則爲真。
[ STRING1 < STRING2 ] 若是 「STRING1」 sorts before 「STRING2」 lexicographically in the current locale則爲真。
[ STRING1 > STRING2 ] 若是 「STRING1」 sorts after 「STRING2」 lexicographically in the current locale則爲真。
[ ARG1 OP ARG2 ] 「OP」 is one of -eq, -ne, -lt, -le, -gt or -ge.These arithmetic binary operators return true if 「ARG1」 is equal to,not equal to, less than, less than or equal to, greater than, orgreater than or equal to 「ARG2」, respectively. 「ARG1」 and 「ARG2」 areintegers. 表達式能夠借如下操做符組合起來,以降序列出:listed in decreasing order ofprecedence

 表 7.2. 組合表達式操做 效果 [ ! EXPR ] 若是 EXPR 是false則爲真。 [ ( EXPR ) ] 返回 EXPR的值。這樣能夠用來忽略正常的操做符優先級。 [ EXPR1 -a EXPR2 ] 若是 EXPR1 and EXPR2 全真則爲真。 [ EXPR1 -o EXPR2 ] 若是 EXPR1 或者 EXPR2 爲真則爲真。 [ (或做 test)內建命令對條件表達式使用一系列基於參數數量的規則來求值。更多關於這個主題的信        ////////////////////////     -eq 等於 -ne 不等於 -gt 大於 -lt 小於 -le 小於等於 -ge 大於等於 -z 空串 * = 兩個字符相等 * != 兩個字符不等 * -n 非空串    ///////////////////////     (7)保留字符及其含義 $ shell變量名的開始,如$var | 管道,將標準輸出轉到下一個命令的標準輸入 # 註釋開始 & 在後臺執行一個進程 ? 匹配一個字符 * 匹配0到多個字符(與DOS不一樣,可在文件名中間使用,而且含.) $- 使用set及執行時傳遞給shell的標誌位 $! 最後一個子進程的進程號 $# 傳遞給shell script的參數個數 $* 傳遞給shell script的參數 $@ 全部參數,個別的用雙引號括起來 $? 上一個命令的返回代碼 $0 當前shell的名字 $n (n:1-) 位置參數 $$ 進程標識號(Process Identifier Number, PID) >file 輸出重定向 <file 輸入重定向 `command` 命令替換,如 filename=`basename /usr/local/bin/tcsh` >>fiile 輸出重定向,append 轉義符及單引號: $echo "$HOME $PATH" /home/hbwork /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin: $echo '$HOME $PATH' $HOME $PATH $echo \\$HOME $PATH $HOME /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/hbw ork/bin 其餘: $dir=ls $$dir $alias dir ls $dir ls > filelist ls >> filelist wc -l < filelist wc -l filelist sleep 5; echo 5 seconds reaches; ls -l ps ax |egrep inetd find / -name core -exec rm {} \\; & filename=`date "+%Y%m%d"`.log 2. shell變量 變量:表明某些值的符號,如$HOME,cd命令查找$HOME,在計算機語言中可使用變量能夠 進行多種運算和控制。 Bourne Shell有以下四種變量: .用戶自定義變量 .位置變量即 shell script之參數 .預約義變量(特殊變量) .環境變量(參考shell定製部分)        /////////////        old_tag=`hg tags | grep db1_V0_ | sed -n -e 1p | sed -e "s/ .*//"` echo $old_tag index=`expr index "$old_tag" _V0_` echo $index new_tag="db1_V0_"`printf "%04d" $((${old_tag:index+3}+1))` echo $new_tag    db1_V0_0002 4 db1_V0_0003     「.*」匹配剩餘的0個或多個字符 替換全部的"s/1/2/g"

相關文章
相關標籤/搜索