婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > shell中的各種括號的使用方法

shell中的各種括號的使用方法

熱門標簽:聯(lián)通電話機器人怎么接 地圖標注輻射圖案 曲阜400電話辦理 安裝外呼系統(tǒng)費用 衛(wèi)星地圖標注地名 奧維互動地圖標注參數(shù) 寧波智能外呼系統(tǒng)公司 申請公司400電話要注意什么 電銷機器人 劍魚

在這里我想說的是幾種shell里的小括號,大括號結構和有括號的變量,命令的用法,如下:

1.${var}
2.$(cmd)
3.()和{}
4.${var:-string},${var:+string},${var:=string},${var:?string}
5.$((exp))
6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)

現(xiàn)在分述如下:


1.Shell中變量的原形:${var}
大家常見的變量形式都是$var,如

$ var=test
$ echo $var
test

但當你要顯示變量值加隨意的字符(我這里用AA)時,就會出錯,如下:

$ echo $varAA

$

這時應該用變量的原形:${var},即是加一個大括號來限定變量名稱的范圍,如下
$ echo ${var}AA
testAA
$

以這個特性,我們可以很方便地寫一個批量改后綴名的程序,我把它命名為mymv,程序如下:
#!/bin/bash

tail=$1
for filename in `ls`
do
mv $filename ${filename}.$tail
done

程序需要提供一個后綴名,如c,表示改為后綴為c的C程序文件,看下面的測試:
$ ls
a b c
$ mymv c
$ ls
a.c b.c c.c
$

看樣子程序運行的很好,但這是不完善的程序,有2個要注意的問題:
A,目錄下沒有子目錄,如果有一個目錄,假設為dir,則也會被改為dir.c,這顯然不是我們想要的,應該修正這個程序能識別目錄。
B,沒有幫助對程序的參數(shù)進行處理,程序應該足夠友好,在用戶沒有給定后綴名時應能處理,像上面的將直接給文件加上了一個點(.),這顯然也不是我們想要的。

因為我們的目的是說明${var},這樣已經(jīng)足夠了,因此這里不會再對上面的程序進行修正。

2.命令替換$(cmd)
命令替換$(cmd)和符號`cmd`(注意這不是單引號,在美式鍵盤上,`是ESC下面的那個鍵)有相同之處
$ ls
a b c
$ echo $(ls)
a b c
$ echo `ls`
a b c

我們來分析一下命令echo $(ls),以便理解所謂命令替換是什么意思:
shell掃描一遍命令行,發(fā)現(xiàn)了$(cmd)結構,便將$(cmd)中的cmd執(zhí)行一次,得到其標準輸出,再將此輸出放到原來命令echo $(ls)中的$(ls)位置,即替換了$(ls),再執(zhí)行echo命令。
如下:
echo $(ls)被替換成了echo a b c
這里要注意的是$(cmd)中的命令的錯誤輸出是不會被替換的,替換的只是標準輸出:
$ var=$(cat d) ###文件d在當前目錄不存在
cat: d: 沒有那個文件或目錄
$ echo $var

$ ###顯然var變量的值是空的

3、一串的命令執(zhí)行()和{}
()和{}都是對一串的命令進行執(zhí)行,但有所區(qū)別:
A,()只是對一串命令重新開一個子shell進行執(zhí)行
B,{}對一串命令在當前shell執(zhí)行
C,()和{}都是把一串的命令放在括號里面,并且命令之間用;號隔開
D,()最后一個命令可以不用分號
E,{}最后一個命令要用分號
F,{}的第一個命令和左括號之間必須要有一個空格
G,()里的各命令不必和括號有空格
H,()和{}中括號里面的某個命令的重定向只影響該命令,但括號外的重定向則影響到括號里的所有命令

我們來看幾個例子:
$ var=test
$ (var=notest; echo $var) ###變量var值為notest,此是在子shell中有效
notest
$ echo $var ###父shell中值仍為test
test
$ { var=notest; echo $var;} ###注意左括號和var之間要有一個空格
notest
$ echo $var ###父shell中的var變量的值變?yōu)榱薾otest
notest
$ { var1=test1;var2=test2;echo $var1>a;echo $var2;} ###輸出test1被重定向到文件a中,
test2 ###而test2輸出則仍輸出到標準輸出中。
$ cat a
test1
$ { var1=test1;var2=test2;echo $var1;echo $var2;}>a ###括號內(nèi)命令的標準輸出全部被重定向到文件a中
$ cat a
test1
test2

下面是一個腳步例子:

(
    echo "1"
    echo "2"
) | awk apos;{print NR,$0}apos;

4,幾種特殊的替換結構:${var:-string},${var:+string},${var:=string},${var:?string}
A,${var:-string}和${var:=string}
若變量var為空,則用在命令行中用string來替換${var:-string},否則變量var不為空時,則用變量var的值來替換${var:-string}
如:
$ echo $newvar

$ echo ${newvar:-a}
a
$ echo $newvar ###變量newvar的值仍然是空,但上一命令行中${newvar:-a}被替換成了a

$ newvar=b
$ echo ${newvar:-a} ###變量newvar的值不為空時,此命令行中的${newvar:-b}被替換為$newvar,即b
b
$

對于${var:=string}的替換規(guī)則和${var:-string}是一樣的,所不同之處是${var:=string}若var為空時,用string替換${var:=string}的同時,把string賦給變量var:


$ echo $newvar

$ echo ${newvar:=a}
a
$ echo $newvar ###變量newvar被賦值為a,同時${newvar:=a}被替換成a
a
$ echo ${newvar:=b} ###變量newvar不為空(其值已被賦為a),則${newvar:=b}被替換為newvar的值(即b)
a
$ echo $newvar
a

${var:=string}很常用的一種用法是,判斷某個變量是否賦值,沒有的話則給它賦上一個默認值。
如設置默認的編輯器:
PHP 代碼:
echo You use editor: ${EDITOR:=/bin/vi}

B,${var:+string}
${var:+string}的替換規(guī)則和上面的相反,即只有當var不是空的時候才替換成string,若var為空時則不替換或者說是替換成變量 var的值,即空值。(因為變量var此時為空,所以這兩種說法是等價的)
$ echo $newvar
a
$ echo ${newvar:+b}
b
$ echo $newvar
a
$ newvar=
$ echo ${newvar:+b}

$

C,${var:?string}
替換規(guī)則為:若變量var不為空,則用變量var的值來替換${var:?string};若變量var為空,則把string輸出到標準錯誤中,并從腳本中退出。我們可利用此特性來檢查是否設置了變量的值。
$ newvar=
$ echo ${newvar:?沒有設置newvar的值}
bash: newvar: 沒有設置newvar的值
$ newvar=a
$ echo ${newvar:?沒有設置newvar的值}
a
$

補充擴展:在上面這五種替換結構中string不一定是常值的,可用另外一個變量的值或是一種命令的輸出。
$ echo ${var:-`date`}
日 3月 6 02:10:39 CST 2005
$ echo ${var:-$(date)}
日 3月 6 02:11:46 CST 2005
$ a=test
$ echo ${var:-$a}
test
$

5.POSIX標準的擴展計算:$((exp))
這種計算是符合C語言的運算符,也就是說只要符合C的運算符都可用在$((exp)),甚至是三目運算符。
注意:這種擴展計算是整數(shù)型的計算,不支持浮點型.若是邏輯判斷,表達式exp為真則為1,假則為0。
$ echo $((3+2))
5
$ echo $((3>2))
1
$ echo $((253 ? 2:3))
3
$ echo $var

$ echo $((var=2+3))
5
$ echo $var
5
$ echo $((var++))
5
$ echo $var
6
$

好了,上面的例子足夠了,這也表明了這種擴展運算是很強大的。

6.四種模式匹配替換結構:${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
這四種結構的意義是:${var%pattern}和${var%%pattern}表示從最右邊(即結尾)匹配的,${var#pattern} 和${var##pattern}從最左邊(即開頭)匹配的。其中${var%pattern}和${var#pattern}是最短匹 配,${var%%pattern}和${var##pattern}是最長匹配。只有在pattern中使用了通配符才能有最長最短的匹配,否則沒有最 長最短匹配之分。

結構中的pattern支持通配符,*表示零個或多個任意字符,?表示零個或一個任意字符,[...]表示匹配中括號里面的字符,[!...]表示不匹配中括號里面的字符。
$ var=aabbbccbbdbb
$ echo ${var%b}
aabbbccbbdb
$ echo ${var%%b}
aabbbccbbdb
$ echo ${var#a}
abbbccbbdbb
$ echo ${var##a}
abbbccbbdbb
$ echo ${var%*b}
aabbbccbbdb
$ echo ${var%%*b}

$ echo ${var#a*}
abbbccbbdbb
$ echo ${var##a*}

$

上面是簡單的例舉四種模式匹配替換結構的用法。

•其他(見man bash中的Parameter Expansion)

${parameter/pattern/string}
              Pattern substitution.  The pattern is expanded to produce a pat‐
              tern  just  as in pathname expansion.  Parameter is expanded and
              the longest match of pattern against its value is replaced  with
              string.   If  pattern  begins with /, all matches of pattern are
              replaced  with  string.   Normally  only  the  first  match   is
              replaced.  If pattern begins with #, it must match at the begin‐
              ning of the expanded value of parameter.  If pattern begins with
              %,  it must match at the end of the expanded value of parameter.
              If string is null, matches of pattern are deleted and the / fol‐
              lowing pattern may be omitted.  If parameter is @ or *, the sub‐
              stitution operation is applied to each positional  parameter  in
              turn,  and the expansion is the resultant list.  If parameter is
              an array variable subscripted with  @  or  *,  the  substitution
              operation  is  applied  to each member of the array in turn, and
              the expansion is the resultant list.

(( )) :一對圓括號有兩個地方用到。

1,for循環(huán),

for (( expr1 ; expr2 ; expr3 ))

這里一對雙括號里邊的表達式,GNU的文檔指出,expr1支持 Shell Arithmetic;expr2不為0時,expr3被賦值且語句執(zhí)行。說的很麻煩,還要花時間搞清楚什么是Shell Arithmetic。其實一言以蔽之,支持數(shù)字條件。比如:

for (( a=0 ; a10 ; a++ )); do echo $a; done

會輸出 0 1 2 3 (帶換行哦~~~)

2,數(shù)學表達

(( )) 和 $(( ))

(( )) 的用法與let一樣,就不用多解釋了吧~~~

$(( ))就是把計算結果拿出來,可以用在雙引號里邊,比如:

echo "1+2=$(( 1 + 2 ))"

會輸出 1+2=3

( ):一個圓括號

在for循環(huán)里,跟C語法一樣一樣的。

或者是子程序,返回整個里邊表達的返回值。里邊的變量都是局部的,修改不會帶到外邊。舉例子

a=1

(a=3; echo $a)

echo a

結果是 3 1

還有個就是圈數(shù)組。。。這個就沒神馬意思了

[ ]:一個方括號,是bash的命令,查man手冊是可以查到的,跟test一樣,在手冊里可以看到很多用法。比如-b -c -gt -eq 什么的很多,還有用-a表示與,-o表示或等等

[[ ]]:一對方括號是一個方括號的加強版,則是Shell的保留字,里邊支持了 || 等等這些符號。一般我喜歡用這個

還有相對復雜的 { }

幾個用處,區(qū)分變量,如:

var=abcd; echo ${var}EFG;

這樣,Bash就不會認為變量是varEFG了

還有用來截取字符串的 ${ }語法比較靈活多變,這里不做多解釋,大家有興趣可以自己去搜搜資料,一般我腳本用到的字符串處理,這個都能搞定了。

代碼塊。用來區(qū)分代碼的,但是跟( )有個區(qū)別,就是在末尾要加上 ;

1.()

在子shell中運行
(a=1);echo $a,結果是空,因為a=1不是在當前shell中運行的(a=1);(echo $a)也是空的。不在同一個子shell中
數(shù)組的賦值,見最后的補充

2.(())

表達式計算
a=1;((a++)); echo $a,這時a就是2了。

3.()和>()

進程代入,可以把命令的執(zhí)行結果當成文件一樣讀入
比如comm前一般需要sort,那就可以這樣comm (sort 1.lst) (sort 2.lst)
或者是paste (cut -t2 file1) (cut -t1 file1)
,和管道差不多,但是支持多個輸入。

4.$()

$(cmd) 執(zhí)行cmd的結果,比如cmd是echo ls,那么就是執(zhí)行l(wèi)s,比如file$(which bash),which bash的結果是/bin/bash,所以file $(which bash)等于file /bin/bash。如果你$(ls),而且你的當前目錄下只有a b兩個文件,那么就是執(zhí)行a b,然后系統(tǒng)會提示,命令沒找到。

5.$(())

表達式擴展,和(())很相似,但是這個是有點不同,$(())不能直接$((b++)),b=1;echo $((++b))這時b等于2,顯示的也是2,b=1;echo $((b++))這時b等于2,顯示的是1.

6.[]和[[]]

[]就是 test,[]和[[]]都是條件表達式,不過[[]]有比[]高的容錯性,如果a為空,那么[ $a -eq 0 ]會報錯,但是[[ $a -eq 0 ]]不會,所以一般都會使用[[]]或者是[ "$a" -eq 0 ],[[]]支持的功能也比[]多,比如[[ aaa =~a{3} ]],
[] 還有一種用途,如果你的當前目錄下有a1-a9九個文件,你可以用a[1-9]來替代這九個文件。有點需要注意,你不能用a[1-20]來代替a1- a20,必須要a[1-9] a1[0-9] a20。

7.$[]

$(())的過去形式,現(xiàn)在已經(jīng)不建議使用

8.{}

{1..30} 就是1-30,或者是/{,s}bin/表示/bin/和/sbin/,ab{c,d,e}表示abc、abd、abe

9.${}

變量,用法很多,可以查看man bash。
先寫這些,以后想到再補充吧。

補充:()同時也是數(shù)組的賦值,比如a=(1 3 5),那么${a[0]}=1;${a[1]}=3;${a[2]}=5,需要注意的是,下標是從0開始的

Shell中的括號有其特殊的用法, 現(xiàn)總結如下:

1. 符號$后的括號

${a} 變量a的值, 在不引起歧義的情況下可以省略大括號.
$(cmd) 命令替換, 結果為shell命令cmd的輸出, 和`cmd`效果相同, 不過某些Shell版本不支持$()形式的命令替換, 如tcsh.
$((exp)) 和`expr exp`效果相同, 計算數(shù)學表達式exp的數(shù)值, 其中exp只要符合C語言的運算規(guī)則即可, 甚至三目運算符和邏輯表達式都可以計算.

2. 多條命令執(zhí)行

(cmd1;cmd2;cmd3) 新開一個子shell順序執(zhí)行命令cmd1,cmd2,cmd3, 各命令之間用分號隔開, 最后一個命令后可以沒有分號.
{ cmd1;cmd2;cmd3;} 在當前shell順序執(zhí)行命令cmd1,cmd2,cmd3, 各命令之間用分號隔開, 最后一個命令后必須有分號, 第一條命令和左括號之間必須用空格隔開.
對{}和()而言, 括號中的重定向符只影響該條命令, 而括號外的重定向符影響到括號中的所有命令.

3. 雙括號的特殊用法

(()) 增強括號的用法, 常用于算術運算比較. 雙括號中的變量可以不使用$符號前綴, 只要括號中的表達式符合C語言運算規(guī)則, 支持多個表達式用逗號分開.
比如可以直接使用for((i=0;i5;i++)), 如果不使用雙括號, 則為for i in `seq 0 4`或者for i in {0..4}.
再如可以直接使用if (($i5)), 如果不使用雙括號, 則為if [ $i -lt 5 ].
[[]] 增強方括號用法, 常用于字符串的比較. 主要用于條件測試, 雙括號中的表達式可以使用, ||, , >等C語言語法.
比如可以直接使用if [[ $a != 1 $a != 2 ]], 如果不適用雙括號, 則為if [ $a -ne 1] [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ].

您可能感興趣的文章:
  • shell中各種括號的作用詳解()、(())、[]、[[]]、{}(推薦)
  • Shell(())實現(xiàn)對整數(shù)進行數(shù)學運算

標簽:上饒 三門峽 遵義 仙桃 大慶 江西 安康 大興安嶺

巨人網(wǎng)絡通訊聲明:本文標題《shell中的各種括號的使用方法》,本文關鍵詞  shell,中的,各種,括,號的,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《shell中的各種括號的使用方法》相關的同類信息!
  • 本頁收集關于shell中的各種括號的使用方法的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久久国产一区二区三区四区小说| av爱爱亚洲一区| 亚洲不卡av一区二区三区| 国产精品女同互慰在线看| 久久精品人人爽人人爽| 久久这里只有精品6| 欧美成人在线直播| 久久综合狠狠综合| 久久精品一二三| 国产精品久线在线观看| ...中文天堂在线一区| 亚洲精品视频在线观看免费| 亚洲午夜免费视频| 日本成人中文字幕| 国产精品538一区二区在线| 成人污视频在线观看| 日本久久精品电影| 777xxx欧美| 久久这里只有精品首页| 亚洲欧美在线观看| 香蕉成人伊视频在线观看| 日产精品久久久久久久性色| 蜜桃av噜噜一区| 成人av电影免费观看| 欧美日韩中文字幕一区二区| 精品欧美久久久| 亚洲丝袜自拍清纯另类| 日本大胆欧美人术艺术动态| 高清不卡一区二区| 欧美精品 日韩| 欧美国产成人精品| 亚洲成人综合在线| 国产伦精品一区二区三区免费 | 欧美一级黄色片| 久久人人爽爽爽人久久久| 中文字幕欧美一区| 日本sm残虐另类| gogo大胆日本视频一区| 日韩免费高清视频| 亚洲欧美另类久久久精品| 另类欧美日韩国产在线| 91蜜桃网址入口| 久久午夜色播影院免费高清| 午夜欧美视频在线观看| 97国产精品videossex| 欧美精品一区二区久久久| 一区二区在线观看视频在线观看| 久久99国产精品麻豆| 91久久精品网| 国产精品久久久久久久久晋中| 日韩国产高清在线| 色域天天综合网| 国产精品国产三级国产普通话99 | 亚洲电影一级黄| av午夜一区麻豆| 久久理论电影网| 美腿丝袜亚洲一区| 欧美伦理视频网站| 亚洲一区二区三区四区中文字幕| 岛国av在线一区| 久久精品夜色噜噜亚洲aⅴ| 美女视频黄a大片欧美| 欧美日本一道本| 亚洲一区二区三区国产| 91色视频在线| 中文字幕日韩精品一区| 国产精品69毛片高清亚洲| 久久久精品日韩欧美| 国产一区二区电影| 久久精品在线观看| 国产iv一区二区三区| 欧美韩国日本一区| 成人免费看黄yyy456| 国产精品午夜在线| 成人av资源下载| 亚洲欧美在线视频| 不卡的看片网站| 亚洲柠檬福利资源导航| 色综合久久综合| 亚洲在线成人精品| 欧美久久婷婷综合色| 毛片av一区二区| 久久久蜜臀国产一区二区| 国产精品亚洲午夜一区二区三区| 国产无一区二区| www..com久久爱| 一区二区三区在线不卡| 欧美日韩在线不卡| 日韩1区2区3区| 国产婷婷色一区二区三区四区 | 日韩免费看的电影| 国内精品国产成人国产三级粉色| 国产亚洲精品福利| www.日韩精品| 日本不卡一区二区三区高清视频| 精品盗摄一区二区三区| 99视频在线精品| 天天操天天色综合| 久久九九全国免费| 91小视频免费看| 日本不卡一二三| 国产精品你懂的在线欣赏| 色欧美日韩亚洲| 麻豆成人av在线| 1024精品合集| 精品国产露脸精彩对白| 99视频超级精品| 奇米精品一区二区三区在线观看| 久久―日本道色综合久久| 色悠悠久久综合| 国产一区二区三区在线看麻豆| 亚洲欧美日韩在线| 久久婷婷色综合| 欧美色图天堂网| 成人午夜大片免费观看| 日本欧美加勒比视频| 亚洲欧美电影一区二区| 久久久综合精品| 91精品国产高清一区二区三区| 91麻豆swag| av一区二区久久| 寂寞少妇一区二区三区| 丝袜美腿成人在线| 亚洲综合一区在线| 中文字幕亚洲欧美在线不卡| 精品久久久久久亚洲综合网| 欧美午夜精品一区二区蜜桃| 成人免费黄色大片| 国产真实精品久久二三区| 日韩精品福利网| 亚洲第一在线综合网站| 亚洲男同性恋视频| 日韩一区中文字幕| 欧美激情中文字幕一区二区| 精品国产亚洲一区二区三区在线观看| 欧美网站大全在线观看| 岛国一区二区在线观看| 韩国一区二区视频| 亚洲电影视频在线| 亚洲国产精品久久人人爱 | 中文天堂在线一区| 亚洲国产欧美在线人成| 国产精品久久久久久久久晋中| 欧美精品乱码久久久久久| va亚洲va日韩不卡在线观看| 麻豆精品在线看| 久久99精品国产91久久来源| 亚洲成人综合网站| 中文字幕一区日韩精品欧美| 精品国产成人在线影院| 精品欧美黑人一区二区三区| 91福利精品视频| 成人免费电影视频| 精彩视频一区二区三区 | 91精品国产免费久久综合| 色噜噜狠狠色综合欧洲selulu| 国产精品一区二区不卡| 亚洲成人1区2区| 日韩精品一级中文字幕精品视频免费观看 | 欧美亚一区二区| 色综合咪咪久久| 欧美电影影音先锋| 欧美日本国产视频| 欧美日韩国产一级片| 色综合久久精品| 欧美亚洲愉拍一区二区| 欧美另类变人与禽xxxxx| 欧美日韩aaaaaa| 日韩视频一区二区三区| 日韩午夜在线观看| 国产网站一区二区三区| 欧美国产精品中文字幕| 国产精品午夜在线观看| 中文字幕视频一区二区三区久| 亚洲国产精品嫩草影院| 亚洲成av人在线观看| 日本欧美一区二区在线观看| 亚洲人成网站影音先锋播放| 石原莉奈在线亚洲三区| 日本午夜一本久久久综合| 蜜臀久久久久久久| 国产99久久久精品| 日韩欧美国产小视频| 2023国产一二三区日本精品2022| 久久久久久久综合| 亚洲一区二区三区在线播放| 日韩高清不卡一区二区| 久久99国产精品尤物| 国产九色sp调教91| 欧美日韩黄视频| 精品国产91乱码一区二区三区| 精品成人免费观看| 国产精品久久久久一区二区三区| 亚洲男人的天堂在线aⅴ视频| 亚洲电影第三页| 经典三级视频一区| 欧美日韩一级黄| 日韩欧美一二区| 久久久亚洲国产美女国产盗摄| 久久久久久亚洲综合|