亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Linux Shell > 正文

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

2020-07-27 19:09:02
字體:
來源:轉載
供稿:網友

在這里我想說的是幾種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)

現在分述如下:


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,沒有幫助對程序的參數進行處理,程序應該足夠友好,在用戶沒有給定后綴名時應能處理,像上面的將直接給文件加上了一個點(.),這顯然也不是我們想要的。

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

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

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

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

3、一串的命令執行()和{}
()和{}都是對一串的命令進行執行,但有所區別:
A,()只是對一串命令重新開一個子shell進行執行
B,{}對一串命令在當前shell執行
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變量的值變為了notest
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 ###括號內命令的標準輸出全部被重定向到文件a中
$ cat a
test1
test2

下面是一個腳步例子:

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

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

$

C,${var:?string}
替換規則為:若變量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)),甚至是三目運算符。
注意:這種擴展計算是整數型的計算,不支持浮點型.若是邏輯判斷,表達式exp為真則為1,假則為0。
$ echo $((3+2))
5
$ echo $((3>2))
1
$ echo $((25<3 ? 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亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

xxxxx91麻豆| 欧美视频国产精品| 欧美成人免费va影院高清| 欧美中文在线免费| 精品久久久久久国产| 青青青国产精品一区二区| 在线免费观看羞羞视频一区二区| 亚洲桃花岛网站| 日韩中文字在线| 美女久久久久久久久久久| 91国产美女在线观看| 日韩精品视频免费在线观看| 久久精品久久久久久| 国产成人啪精品视频免费网| 国产mv免费观看入口亚洲| 欧美性猛交xxxx富婆| 日韩在线观看免费高清完整版| 91精品视频在线免费观看| 国产欧美最新羞羞视频在线观看| 成人免费看片视频| 在线日韩日本国产亚洲| 国产精品美女视频网站| 欧美大全免费观看电视剧大泉洋| 国产在线视频2019最新视频| 热门国产精品亚洲第一区在线| 亚洲黄色av女优在线观看| 91av在线不卡| 亚洲成人av片在线观看| 一道本无吗dⅴd在线播放一区| 亚洲成人av在线| 国产成人综合精品| www.xxxx精品| 日本欧美精品在线| 亚洲午夜性刺激影院| 欧美亚洲视频在线看网址| 精品国产欧美成人夜夜嗨| 亚洲国内高清视频| 久久精品视频在线| 亚洲加勒比久久88色综合| 91视频国产高清| 91精品在线影院| 91中文在线视频| 国产精品网红直播| 92福利视频午夜1000合集在线观看| 国内精品久久久久| 91精品久久久久久久久久久| 日韩在线观看网站| 国产精品美女久久久久av超清| 亚洲图片制服诱惑| 亚洲色图偷窥自拍| 日韩av手机在线观看| 热门国产精品亚洲第一区在线| 久久久精品亚洲| 久久久久久久久国产| 日韩精品福利在线| 国产精品99久久久久久www| 日韩精品久久久久| 日本人成精品视频在线| 国产+人+亚洲| 成人激情视频小说免费下载| 亚洲福利精品在线| 国产欧美日韩视频| 亚洲欧美综合另类中字| 日韩视频第一页| 亚洲最新视频在线| 国产主播在线一区| 久久国产精品影视| 91深夜福利视频| 欧美激情a∨在线视频播放| 国产精品稀缺呦系列在线| 久久成人一区二区| 97福利一区二区| 日韩欧美aⅴ综合网站发布| 日韩视频免费中文字幕| 北条麻妃久久精品| 日韩亚洲第一页| 欧美日韩在线观看视频小说| 国产香蕉97碰碰久久人人| 91久久国产综合久久91精品网站| 91夜夜未满十八勿入爽爽影院| 自拍视频国产精品| 北条麻妃一区二区在线观看| 91av在线不卡| 青青久久av北条麻妃海外网| 久久精品2019中文字幕| 91日韩在线播放| 97超碰蝌蚪网人人做人人爽| 国产视频久久久久久久| 欧美极品少妇xxxxx| 久久久久久久久久久久久久久久久久av| 日本19禁啪啪免费观看www| 高跟丝袜一区二区三区| 欧美成人一区二区三区电影| 欧美福利小视频| 亚洲欧美日韩高清| 亚洲一区中文字幕在线观看| 亚洲欧美第一页| 国产精品日韩av| 久久成人免费视频| 日韩在线视频线视频免费网站| 色偷偷91综合久久噜噜| 欧美性猛交xxx| 国产亚洲视频在线观看| 久久久精品中文字幕| 国产91精品久久久久久久| 一区二区亚洲精品国产| 国产精品久久久久久av下载红粉| 一区二区三区天堂av| 久久天天躁狠狠躁夜夜爽蜜月| 国产精品免费电影| 91中文精品字幕在线视频| 精品国产电影一区| 中文字幕日韩av综合精品| 国产suv精品一区二区| 国内揄拍国内精品| 欧美性jizz18性欧美| 91大神福利视频在线| 精品国产一区二区三区久久| 美女av一区二区三区| 国产精品久久久久久久一区探花| 日韩欧美一区视频| 日韩欧美亚洲一二三区| 日韩一中文字幕| 亚洲自拍高清视频网站| 国产精品露脸av在线| 热99精品里视频精品| 欧美国产欧美亚洲国产日韩mv天天看完整| 中文字幕国产精品久久| 国产一区二区三区日韩欧美| 国产精品美女无圣光视频| 欧美视频在线免费| 久久人人97超碰精品888| 精品中文字幕久久久久久| 欧美在线观看网站| 97婷婷大伊香蕉精品视频| 欧美理论片在线观看| 国产精品扒开腿做爽爽爽视频| 久久人人爽人人爽爽久久| 精品久久久999| 欧美精品日韩三级| 亚洲在线观看视频网站| 亚洲综合精品伊人久久| 欧美精品做受xxx性少妇| 国产成人精品a视频一区www| 久久亚洲精品小早川怜子66| 亚洲第一色在线| 91亚洲精品一区| 亚洲电影免费观看高清| 欧美高清激情视频| 日韩亚洲国产中文字幕| 日韩中文综合网| 亚洲国产成人久久综合一区| 91高清视频免费| 国产精品网站大全| 国产在线观看精品一区二区三区| 亚洲精品欧美日韩| 欧美黄色片在线观看| 亚洲欧美在线一区| 欧美精品在线观看91| 久久天天躁狠狠躁夜夜av| 亚洲第一福利视频| 国产精品尤物福利片在线观看| 富二代精品短视频| 欧美专区日韩视频|