日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

bash下: () {} [] [[]] (())的解释

發(fā)布時(shí)間:2023/12/31 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bash下: () {} [] [[]] (())的解释 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自:http://dev.firnow.com/course/3_program/shell/shelljs/20090828/172746.html

bash下有很多像{}、[]等一些符號(hào)命令,下面是我對(duì)一些常用的符號(hào)命令的學(xué)習(xí)筆記,若有錯(cuò)誤或紕漏望各位兄弟指正。

一、.(source)
.(點(diǎn))與source命令一樣,從文件中讀取并執(zhí)行命令,無(wú)論該文件是否都有可執(zhí)行權(quán)限都能夠正確的執(zhí)行。且是在當(dāng)前shell下執(zhí)行,而不是產(chǎn)生一個(gè)子shell來(lái)執(zhí)行(我們通常使用“./filename.sh”去執(zhí)行一個(gè)文件是在當(dāng)前shell下產(chǎn)生一個(gè)子shell去執(zhí)行的)。所以在設(shè)置bash的環(huán)境的變量時(shí),就必須用該命令或者source命令去執(zhí)行設(shè)置的環(huán)境變量才會(huì)對(duì)當(dāng)前shell生效,如下:

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


二、:
: 該命令什么都不做,但執(zhí)行后會(huì)返回一個(gè)正確的退出代碼,即exit 0。比如在if語(yǔ)句中,then后面不想做任何操作,但是又不能空著,這時(shí)就可以使用“:”來(lái)解決,如下:

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


三、()
() 將多個(gè)命令組合在一起執(zhí)行,相當(dāng)于一個(gè)命令組。

四、{}
{}? 和()類似,也是將多個(gè)命令組合在一起。它們之間的區(qū)別是,()是在產(chǎn)生的子shell下執(zhí)行,而{}是在當(dāng)前的shell下執(zhí)行。這與前面講到是使用".? filename.sh"和"./filename.sh"的區(qū)別一樣。舉一個(gè)很簡(jiǎn)單的例子:
?

# A=123
?#?
(A=abc;echo?$A);echo?$A
abc
123
#
?{ A=abc;echo?$A;?};echo?$A
abc
abc


從上面的示例可以看出,當(dāng)在()中賦值的變量,影響的只是自身的子shell,而不能將該值賦給父shell,因?yàn)椤案赣H不能繼承兒子”。而在{}中賦值的變量,因?yàn)榫驮诋?dāng)前的shell執(zhí)行的,所以就能改變?cè)瓉?lái)變量的值。
注意:()里面兩邊可以不使用空格,{}里面兩邊必須使用空格,且最后一個(gè)命令也需要以“;”結(jié)尾,表示命令結(jié)束。

五、[](test)
[] 與test命令一樣,用于比較值以及檢查文件類型。如下:
1、[ "$A" = 123 ]:是字符串的測(cè)試,以測(cè)試 $A 是否為 1、2、3 這三個(gè)連續(xù)的"文字"。
2、[ "$A" -eq 123 ]:是整數(shù)的測(cè)試,以測(cè)試 $A 是否等于"一百二十三"。
3、[ -e "$A" ]:是關(guān)于文件的測(cè)試,以測(cè)試 123 這份"文件"是否存在。

六、[[]]
[[]]可以說(shuō)是[]的“增強(qiáng)版”,它能夠?qū)⒍鄠€(gè)test命令支持的測(cè)試組合起來(lái),例如:

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

home is a writable directory


至于這兩者的區(qū)別有位仁兄已經(jīng)寫(xiě)的很清楚了,我將其整理一下:

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

SPAN style="COLOR: rgb(0,1,2)">一致,但在[]中,>和<必須使用\進(jìn)行轉(zhuǎn)義,即\>和\<
邏輯測(cè)試:?[]為?-a?-o?!?[[?]]?為&&?||?!
數(shù)學(xué)運(yùn)算:?[]?不可以使用?[[?]]可以使用+?-?*/ %
組合: 均可用各自邏輯符號(hào)連接的數(shù)字(運(yùn)算)測(cè)試、文件測(cè)試、字符測(cè)試


拿這兩者對(duì)字符串的測(cè)試舉一個(gè)例子,如下:

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


字符串的比較是根據(jù)相應(yīng)的ASCII碼來(lái)比較的,所以a>1是成立的。如果有興趣也可以思考一下為什么會(huì)出現(xiàn)下面的結(jié)果?

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


七、(())
(())專門(mén)來(lái)做數(shù)值運(yùn)算,如果表達(dá)式求值為 0,則設(shè)置退出狀態(tài)為 1;如果求值為非 0 值,則設(shè)置為 0。不需要對(duì)?((?和?))?之間的操作符轉(zhuǎn)義。算術(shù)只對(duì)整數(shù)進(jìn)行。除 0 會(huì)產(chǎn)生錯(cuò)誤,但不會(huì)產(chǎn)生溢出??梢詧?zhí)行 C 語(yǔ)言中常見(jiàn)的算術(shù)、邏輯和位操作。如下:

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


也能:

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


除此之外,也可以使用$(())直接進(jìn)行數(shù)值運(yùn)算,如下:

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


注意:使用?((?))?時(shí),不需要空格分隔各值和運(yùn)算符,使用[]和[[?]]?時(shí)需要用空格分隔各值和運(yùn)算符。?
??
??
組合判斷:?
??
if [ $a -ne 0 ] && [ $b -lt 3 ] || [ $c -gt 5 ]?
then?
#你在這里加其他操作?
fi?
??
??
//?
??
7.1.1.1. 和if使用的表達(dá)式 下表包含了一個(gè)組成 TEST-COMMAND 命令或者命令列表,稱作 “要素primaries” 的概覽。這些primaries放置在方括號(hào)中來(lái)表示一個(gè)條件表達(dá)式的測(cè)試。 表 7.1. 主表達(dá)式Primary 意義
[ -a FILE ] 如果 FILE 存在則為真。
[ -b FILE ] 如果 FILE 存在且是一個(gè)塊特殊文件則為真。
[ -c FILE ] 如果 FILE 存在且是一個(gè)字特殊文件則為真。
[ -d FILE ] 如果 FILE 存在且是一個(gè)目錄則為真。
[ -e FILE ] 如果 FILE 存在則為真。
[ -f FILE ] 如果 FILE 存在且是一個(gè)普通文件則為真。
[ -g FILE ] 如果 FILE 存在且已經(jīng)設(shè)置了SGID則為真。
[ -h FILE ] 如果 FILE 存在且是一個(gè)符號(hào)連接則為真。
[ -k FILE ] 如果 FILE 存在且已經(jīng)設(shè)置了粘制位則為真。
[ -p FILE ] 如果 FILE 存在且是一個(gè)名字管道(F如果O)則為真。
[ -r FILE ] 如果 FILE 存在且是可讀的則為真。
[ -s FILE ] 如果 FILE 存在且大小不為0則為真。
[ -t FD ] 如果文件描述符 FD 打開(kāi)且指向一個(gè)終端則為真。
[ -u FILE ] 如果 FILE 存在且設(shè)置了SUID (set user ID)則為真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可寫(xiě)的則為真。
[ -x FILE ] 如果 FILE 存在且是可執(zhí)行的則為真。
[ -O FILE ] 如果 FILE 存在且屬有效用戶ID則為真。
[ -G FILE ] 如果 FILE 存在且屬有效用戶組則為真。
[ -L FILE ] 如果 FILE 存在且是一個(gè)符號(hào)連接則為真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則為真。
[ -S FILE ] 如果 FILE 存在且是一個(gè)套接字則為真。
[ 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 指向相同的設(shè)備和節(jié)點(diǎn)號(hào)則為真。
[ -o OPTIONNAME ] 如果 shell選項(xiàng) “OPTIONNAME” 開(kāi)啟則為真。
[ -z STRING ] “STRING” 的長(zhǎng)度為零則為真。
[ -n STRING ] or [ STRING ] “STRING” 的長(zhǎng)度為非零 non-zero則為真。
[ STRING1 == STRING2 ] 如果2個(gè)字符串相同。 “=” 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. 表達(dá)式可以借以下操作符組合起來(lái),以降序列出:listed in decreasing order ofprecedence

?表 7.2. 組合表達(dá)式操作 效果
[ ! EXPR ] 如果 EXPR 是false則為真。
[ ( EXPR ) ] 返回 EXPR的值。這樣可以用來(lái)忽略正常的操作符優(yōu)先級(jí)。
[ EXPR1 -a EXPR2 ] 如果 EXPR1 and EXPR2 全真則為真。
[ EXPR1 -o EXPR2 ] 如果 EXPR1 或者 EXPR2 為真則為真。 [ (或作 test)內(nèi)建命令對(duì)條件表達(dá)式使用一系列基于參數(shù)數(shù)量的規(guī)則來(lái)求值。更多關(guān)于這個(gè)主題的信?
??
??
?
??
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
* = 兩個(gè)字符相等
* != 兩個(gè)字符不等
* -n 非空串

??
///?
??
(7)保留字符及其含義

$ shell變量名的開(kāi)始,如$var

| 管道,將標(biāo)準(zhǔn)輸出轉(zhuǎn)到下一個(gè)命令的標(biāo)準(zhǔn)輸入

# 注釋開(kāi)始

& 在后臺(tái)執(zhí)行一個(gè)進(jìn)程

? 匹配一個(gè)字符

* 匹配0到多個(gè)字符(與DOS不同,可在文件名中間使用,并且含.)

$- 使用set及執(zhí)行時(shí)傳遞給shell的標(biāo)志位

$! 最后一個(gè)子進(jìn)程的進(jìn)程號(hào)

$# 傳遞給shell script的參數(shù)個(gè)數(shù)

$* 傳遞給shell script的參數(shù)

$@ 所有參數(shù),個(gè)別的用雙引號(hào)括起來(lái)

$? 上一個(gè)命令的返回代碼

$0 當(dāng)前shell的名字

$n (n:1-) 位置參數(shù)

$$ 進(jìn)程標(biāo)識(shí)號(hào)(Process Identifier Number, PID)

>file 輸出重定向

<file 輸入重定向

`command` 命令替換,如 filename=`basename /usr/local/bin/tcsh`

>>fiile 輸出重定向,append

轉(zhuǎn)義符及單引號(hào):

$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變量

變量:代表某些值的符號(hào),如$HOME,cd命令查找$HOME,在計(jì)算機(jī)語(yǔ)言中可以使用變量可以

進(jìn)行多種運(yùn)算和控制。

Bourne Shell有如下四種變量:

.用戶自定義變量

.位置變量即 shell script之參數(shù)

.預(yù)定義變量(特殊變量)

.環(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個(gè)或多個(gè)字符

替換所有的"s/1/2/g"

轉(zhuǎn)載于:https://www.cnblogs.com/fhefh/archive/2011/04/16/2017895.html

總結(jié)

以上是生活随笔為你收集整理的bash下: () {} [] [[]] (())的解释的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。