bash下: () {} [] [[]] (())的解释
轉(zhuǎn)載自:http://dev.firnow.com/course/3_program/shell/shelljs/20090828/172746.html
bash下有很多像{}、[]等一些符號命令,下面是我對一些常用的符號命令的學習筆記,若有錯誤或紕漏望各位兄弟指正。一、.(source)
.(點)與source命令一樣,從文件中讀取并執(zhí)行命令,無論該文件是否都有可執(zhí)行權限都能夠正確的執(zhí)行。且是在當前shell下執(zhí)行,而不是產(chǎn)生一個子shell來執(zhí)行(我們通常使用“./filename.sh”去執(zhí)行一個文件是在當前shell下產(chǎn)生一個子shell去執(zhí)行的)。所以在設置bash的環(huán)境的變量時,就必須用該命令或者source命令去執(zhí)行設置的環(huán)境變量才會對當前shell生效,如下:
| for?i?in?/etc/profile.d/*.sh?;?do |
二、:
: 該命令什么都不做,但執(zhí)行后會返回一個正確的退出代碼,即exit 0。比如在if語句中,then后面不想做任何操作,但是又不能空著,這時就可以使用“:”來解決,如下:
| if?[?"$i"?-ne?1?];then |
三、()
() 將多個命令組合在一起執(zhí)行,相當于一個命令組。
四、{}
{}? 和()類似,也是將多個命令組合在一起。它們之間的區(qū)別是,()是在產(chǎn)生的子shell下執(zhí)行,而{}是在當前的shell下執(zhí)行。這與前面講到是使用".? filename.sh"和"./filename.sh"的區(qū)別一樣。舉一個很簡單的例子:
?
| # A=123 |
從上面的示例可以看出,當在()中賦值的變量,影響的只是自身的子shell,而不能將該值賦給父shell,因為“父親不能繼承兒子”。而在{}中賦值的變量,因為就在當前的shell執(zhí)行的,所以就能改變原來變量的值。
注意:()里面兩邊可以不使用空格,{}里面兩邊必須使用空格,且最后一個命令也需要以“;”結尾,表示命令結束。
五、[](test)
[] 與test命令一樣,用于比較值以及檢查文件類型。如下:
1、[ "$A" = 123 ]:是字符串的測試,以測試 $A 是否為 1、2、3 這三個連續(xù)的"文字"。
2、[ "$A" -eq 123 ]:是整數(shù)的測試,以測試 $A 是否等于"一百二十三"。
3、[ -e "$A" ]:是關于文件的測試,以測試 123 這份"文件"是否存在。
六、[[]]
[[]]可以說是[]的“增強版”,它能夠?qū)⒍鄠€test命令支持的測試組合起來,例如:
| # [[ (-d "$HOME") && (-w "$HOME") ]] && echo echo "home is a writable directory"?? home is a writable directory |
至于這兩者的區(qū)別有位仁兄已經(jīng)寫的很清楚了,我將其整理一下:
| 數(shù)字測試:?-eq?-ne?-lt?-le?-gt?-ge,[[?]]同?[?]一致 |
| SPAN style="COLOR: rgb(0,1,2)">一致,但在[]中,>和<必須使用\進行轉(zhuǎn)義,即\>和\< |
拿這兩者對字符串的測試舉一個例子,如下:
| #?[?a \>?1?]?&&?echo?ture?||?echo?false |
字符串的比較是根據(jù)相應的ASCII碼來比較的,所以a>1是成立的。如果有興趣也可以思考一下為什么會出現(xiàn)下面的結果?
| #?[[?a?>?1?]]?&&?echo?ture?||?echo?false |
七、(())
(())專門來做數(shù)值運算,如果表達式求值為 0,則設置退出狀態(tài)為 1;如果求值為非 0 值,則設置為 0。不需要對?((?和?))?之間的操作符轉(zhuǎn)義。算術只對整數(shù)進行。除 0 會產(chǎn)生錯誤,但不會產(chǎn)生溢出。可以執(zhí)行 C 語言中常見的算術、邏輯和位操作。如下:
| #?((i=1+99));echo?$i |
也能:
| # i=99;((i++));echo?$i |
除此之外,也可以使用$(())直接進行數(shù)值運算,如下:
| #?echo?$((2**3)) |
注意:使用?((?))?時,不需要空格分隔各值和運算符,使用[]和[[?]]?時需要用空格分隔各值和運算符。?
??
??
組合判斷:?
??
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 存在且已經(jīng)設置了SGID則為真。
[ -h FILE ] 如果 FILE 存在且是一個符號連接則為真。
[ -k FILE ] 如果 FILE 存在且已經(jīng)設置了粘制位則為真。
[ -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 存在且是可執(zhí)行的則為真。
[ -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 指向相同的設備和節(jié)點號則為真。
[ -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的值。這樣可以用來忽略正常的操作符優(yōu)先級。
[ EXPR1 -a EXPR2 ] 如果 EXPR1 and EXPR2 全真則為真。
[ EXPR1 -o EXPR2 ] 如果 EXPR1 或者 EXPR2 為真則為真。 [ (或作 test)內(nèi)建命令對條件表達式使用一系列基于參數(shù)數(shù)量的規(guī)則來求值。更多關于這個主題的信?
??
??
?
??
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
* = 兩個字符相等
* != 兩個字符不等
* -n 非空串
??
///?
??
(7)保留字符及其含義
$ shell變量名的開始,如$var
| 管道,將標準輸出轉(zhuǎn)到下一個命令的標準輸入
# 注釋開始
& 在后臺執(zhí)行一個進程
? 匹配一個字符
* 匹配0到多個字符(與DOS不同,可在文件名中間使用,并且含.)
$- 使用set及執(zhí)行時傳遞給shell的標志位
$! 最后一個子進程的進程號
$# 傳遞給shell script的參數(shù)個數(shù)
$* 傳遞給shell script的參數(shù)
$@ 所有參數(shù),個別的用雙引號括起來
$? 上一個命令的返回代碼
$0 當前shell的名字
$n (n:1-) 位置參數(shù)
$$ 進程標識號(Process Identifier Number, PID)
>file 輸出重定向
<file 輸入重定向
`command` 命令替換,如 filename=`basename /usr/local/bin/tcsh`
>>fiile 輸出重定向,append
轉(zhuǎn)義符及單引號:
$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之參數(shù)
.預定義變量(特殊變量)
.環(huán)境變量(參考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"
轉(zhuǎn)載于:https://www.cnblogs.com/fhefh/archive/2011/04/16/2017895.html
總結
以上是生活随笔為你收集整理的bash下: () {} [] [[]] (())的解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深邃的近义词有哪些
- 下一篇: qq飞车网名大全183个