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

首頁 > 開發 > Linux Shell > 正文

Shell 編程:Bash空格的那點事

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

先了解下bash中什么時候該用空格,什么時候不該用。

1. 等號賦值兩邊不能有空格
2. 命令與選項之間需要空格
3. 管道兩邊空格可有可無

我們來看看常見的問題

1. 賦值時等號兩邊或者只有左邊多了空格

igi@gentoo ~ $ var1 = testbash: var1: command not foundigi@gentoo ~ $ echo ${var1:?error}bash: var1: errorigi@gentoo ~ $ echo ${var1?error}bash: var1: errorigi@gentoo ~ $ var2 =testbash: var2: command not foundigi@gentoo ~ $ echo ${var2:?error}bash: var2: errorigi@gentoo ~ $ echo ${var2?error}bash: var2: error

這里我用了bash的變量擴展,${var1:?error}當var1為unset或null(未定義或空)時, 報指定錯誤; ${var1?error}當var1為unset時,報指定錯誤 。從執行結果來看,如果等號左邊有空格,則變量名當成命令執行,結果報command not found,變量沒有被賦值

2. 賦值時等號左邊沒有空格,右邊有空格(這種情況有點特別,你會發現兩種情況)

igi@gentoo ~ $ var= testigi@gentoo ~ $ var= nocmdbash: nocmd: command not found

同樣是等號右邊有空格,第一條命令沒報錯,而第二條報錯了。
這是因為shell中有這么一種執行命令的方式: var=string command
命令command將得到變量var的值(至于在命令執行后,變量var的值是否保留下來,bash4中沒有保留,但我在dash中發現時保留下來的,不 同的shell對這個的處理不同), 由于test是個命令,而nocmd不是,所以報了command not found.

igi@gentoo ~ $ var=newtest eval echo /$varnewtestigi@gentoo ~ $ echo $var

注意: 這里我使用了eval, 是想避免在第一次解析時$var被替換成空字符串, 不然就會出現下面的情況(下面是錯誤的測試方法,在echo還沒執行時,$var已經被替換成空字符串)

復制代碼 代碼如下:

igi@gentoo ~ $ var=newtest echo $var
igi@gentoo ~ $ echo $var

到這里,相信大家都明白了吧, 對于等號賦值,左右兩邊不可以有空格,雖然右邊有空格不一定報錯,但那絕對不是你想要的結果。

3. 命令和選項之間必須有空格
這個似乎大家都明白,為何我還這么羅嗦呢?說到這里,不得不提一下一個非常特別的命令: [ 命令(你沒看錯,是[ ), 也就是test命令(當然bash中,這是個內置命令,但在這里不影響
我們的理解)?;蛟S你會覺得[命令眼熟,沒錯,我保證你見過它,來看看下面的例子

igi@gentoo ~ $ if [ "abc" = "abc" ]; then echo ‘they are the same'; fithey are the sameigi@gentoo ~ $ type -a [[ is a shell builtin[ is /usr/bin/[

想起來了吧?[命令經常用到if判斷中,當然也有人喜歡這么寫

igi@gentoo ~ $ [ "abc" = "cba" ] || echo ‘they are not the same'they are not the sameigi@gentoo ~ $ type -a [[ is a shell builtin[ is /usr/bin/[

[ 命令正名叫test命令,它們兩者幾乎一樣,為什么不是完全一樣?來看看這個

igi@gentoo ~ $ [ "abc" = "cba"bash: [: missing `]‘igi@gentoo ~ $ [ "abc" = "cba" ]igi@gentoo ~ $ test "abc" = "cba" ]bash: test: too many argumentsigi@gentoo ~ $ test "abc" = "cba"

清晰了吧,用[命令時,你必須給它個尾巴], 用test命令時,就不能加個尾巴。尾巴]是[最后一個參數,不可缺少的參數, 代表[命令的結束

扯了這么多,那到底這個和空格有毛關系?說這些,是先讓大家明白: [在shell中是個命令,它左右必須有空格!]是[的最后不可缺少的參數,它兩邊也需要空格(雖然有些命令的參數能連一起,例如ps, 但[命令不行,它的參數之間必須有空格)。讓我們看看關于[常見的錯誤

a. if 與 [ 之間缺少空格

igi@gentoo ~ $ if[ "$HOME" = "/home/igi"];then echo 'equal'; fibash: syntax error near unexpected token `then'igi@gentoo ~ $ if[ "$HOME" = "/home/igi" ];then echo 'equal'; fibash: syntax error near unexpected token `then'igi@gentoo ~ $ if["$HOME" = "/home/igi"];then echo 'equal'; fibash: syntax error near unexpected token `then'igi@gentoo ~ $ if["$HOME" = "/home/igi" ];then echo 'equal'; fibash: syntax error near unexpected token `then'

語法分析錯誤,很明顯,if[ 對于bash來說,不知道是什么鬼東西

b. [與后面的參數之間缺少空格

igi@gentoo ~ $ if ["$HOME" = "/home/igi" ];then echo 'equal'; fibash: [/home/igi: No such file or directoryigi@gentoo ~ $ if ["$HOME" = "/home/igi"];then echo 'equal'; fibash: [/home/igi: No such file or directory

["$HOME" 對于bash來說,也不知道是什么鬼東西

c. [ ] 之間的參數之間缺少空格

igi@gentoo ~ $ if [ "abc"="abc" ]; then echo 'equal'; fiequaligi@gentoo ~ $ if [ "abc"="cba" ]; then echo 'equal'; fiequal

第一條命令似乎是對的(實際上是正巧而已),看看第二條命令"abc" 和 "cba"明顯不同,但卻判斷為相同。這是因為參數之間缺少了空格,被[命令認為內部是個值而已??纯聪旅娴拿睿憔蜁屓?/p>

igi@gentoo ~ $ if [ 0 ]; then echo 'equal'; fiequaligi@gentoo ~ $ if [ "1" ]; then echo 'equal'; fiequaligi@gentoo ~ $ if [ "" ]; then echo 'equal'; fiigi@gentoo ~ $ if [ ]; then echo 'equal'; fi

在[ ] 內部,如果只有一個值(那些因為缺少了空格而連一起的也算),不是空字符串就為真。所以在[ ] 之間的參數,也要兩邊有空格,而不能堆一起

d. 參數和尾巴]之間缺少空格
這個就不羅嗦了,尾巴]也是[命令的參數,如同上面所講,參數之間必須有空格

扯了這么多[命令與空格的事,但有些時候,缺了空格卻能正確運行, 當然這只是你好運, 一起來看看

igi@gentoo ~ $ var=' abc'igi@gentoo ~ $ if [$var = "abc" ];then echo 'equal'; fiequaligi@gentoo ~ $ if ["$var" = "abc" ];then echo 'equal'; fibash: [ abc: command not found

之前Bash引號那點事提到過,雙引號包圍起來的是一個整體,而沒雙引號的時候,字符串前后的空格或制表符都被切開。如果恰巧你遇到了或者你故意要丟棄字符串前后的空格或制表符,那也不是不可能, 但非常不建議你這么寫,你的代碼將是非常脆弱的。

或者你該加的空格都加了,但還是報錯,這也可能和缺少雙引號有關。這樣的情況很普遍,最后再看看

igi@gentoo ~ $ var=''igi@gentoo ~ $ if [ "$var" = "abc" ];then echo 'equal'; fiigi@gentoo ~ $ if [ $var = "abc" ];then echo 'equal'; fibash: [: =: unary operator expectedigi@gentoo ~ $ dvar='a b c'igi@gentoo ~ $ if [ $dvar = "a b c" ];then echo 'equal'; fibash: [: too many argumentsigi@gentoo ~ $ if [ "$dvar" = "a b c" ];then echo 'equal'; fiequal

我再羅嗦一次,不要輕易省略雙引號。很清楚了吧?如果你還不明白,
請讀讀Bash引號那點事

最后,對于管道兩邊可有可無的空格,就不扯淡了,因為沒遇到有人對此有疑惑.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天堂av在线免费观看| 久久久久久久香蕉网| 色先锋资源久久综合5566| 欧美中文在线视频| 久久久91精品国产一区不卡| 亚洲福利视频专区| 欧美黄网免费在线观看| 国产成+人+综合+亚洲欧美丁香花| 亚洲精品天天看| 欧美中文字幕精品| 福利一区福利二区微拍刺激| 久久久亚洲欧洲日产国码aⅴ| 欧美精品免费播放| 欧美在线视频在线播放完整版免费观看| 国产精品免费视频久久久| yw.139尤物在线精品视频| 亚洲欧美中文在线视频| 5566成人精品视频免费| 欧美精品制服第一页| 日韩69视频在线观看| 国产精品日韩欧美| 国产成人精品国内自产拍免费看| 亚洲视频视频在线| 色综合久久88色综合天天看泰| 97香蕉超级碰碰久久免费的优势| 日韩高清电影好看的电视剧电影| 国产精品久久久久久网站| 亚洲成人中文字幕| 国产日韩精品一区二区| 亚洲色图美腿丝袜| 亚洲美女免费精品视频在线观看| 精品久久久91| 久久久久久久一| 91国偷自产一区二区三区的观看方式| 亚洲精品国偷自产在线99热| 日本精品视频网站| 国内外成人免费激情在线视频| 国产精品一区二区久久国产| 日韩欧美国产骚| 日韩精品免费一线在线观看| 亚洲精品中文字幕av| 2019中文字幕在线观看| 激情成人在线视频| 国产欧美亚洲精品| 一区二区三区美女xx视频| 亚洲欧美精品suv| 亚洲精品videossex少妇| 亚洲成年人影院在线| 亚洲精品456在线播放狼人| 在线观看亚洲视频| 欧美激情欧美激情在线五月| 亚洲淫片在线视频| 亚洲精品一区二区网址| 亚洲第一精品电影| 日韩美女免费视频| 欧美精品一二区| 欧美激情久久久| 亚洲精品之草原avav久久| 亚洲天堂av图片| 国产精品第七十二页| 久久久久国产精品免费| 国产精品96久久久久久| 欧美性感美女h网站在线观看免费| 久久久久久午夜| 精品综合久久久久久97| 91久久国产综合久久91精品网站| 91po在线观看91精品国产性色| 久久韩剧网电视剧| 亚洲欧洲一区二区三区在线观看| 国产精品成人av性教育| 欧美日韩激情视频| 亚洲欧美日韩天堂一区二区| 欧美日韩亚洲高清| 欧美精品激情视频| 一本大道香蕉久在线播放29| 欧美国产日韩中文字幕在线| 国产精品揄拍一区二区| 国产欧美日韩精品丝袜高跟鞋| 欧美电影免费观看高清完整| 狠狠躁夜夜躁人人爽超碰91| 亚洲国产日韩欧美在线图片| 超碰91人人草人人干| 成人激情在线播放| 91啪国产在线| 日韩精品在线免费播放| 国产狼人综合免费视频| 人人爽久久涩噜噜噜网站| 岛国精品视频在线播放| 丝袜亚洲另类欧美重口| 美女av一区二区| 国产欧美精品日韩精品| 欧美一级电影久久| www.久久色.com| 亚洲成人黄色在线观看| 国产日韩精品在线| 久久精品视频网站| 久久免费精品日本久久中文字幕| 亚洲天堂网在线观看| 成人免费在线视频网站| 亚洲综合中文字幕在线| 欧美性猛交xxxx黑人猛交| 久久99青青精品免费观看| 亚洲资源在线看| 亚洲xxxx妇黄裸体| 国产精品欧美一区二区三区奶水| 国产精品自产拍高潮在线观看| xx视频.9999.com| 国产精品激情av在线播放| 尤物yw午夜国产精品视频明星| 日韩暖暖在线视频| 亚洲人成五月天| 亚洲影视九九影院在线观看| 国产综合香蕉五月婷在线| 欧美色另类天堂2015| 国产精品久久久久久久久久小说| 欧美日韩福利电影| 尤物yw午夜国产精品视频明星| 97碰碰碰免费色视频| 久久天天躁狠狠躁夜夜躁2014| 国产精品久久久久77777| 国产欧洲精品视频| 久久精品福利视频| 欧美日韩福利电影| 狠狠色狠狠色综合日日五| 亚洲一区二区三区成人在线视频精品| 亚洲毛片在线免费观看| 国产精品视频资源| 亚洲天堂av电影| 国产日韩换脸av一区在线观看| 亚洲精品美女在线| 亚洲人成在线免费观看| 欧美有码在线观看| 国产69精品久久久久9999| 九九久久久久99精品| 亚洲精品一区中文| 亚洲精品美女视频| 91免费在线视频| 精品国内产的精品视频在线观看| 欧美性xxxx极品高清hd直播| 欧美日产国产成人免费图片| 精品久久久视频| 亚洲视频欧洲视频| 97精品在线观看| 中文字幕精品影院| 色偷偷噜噜噜亚洲男人| 国产成人久久精品| 亚洲a级在线观看| 欧美性猛交xxxx偷拍洗澡| 日韩欧美主播在线| 亚洲天堂av图片| 国产区精品在线观看| 国产精品中文字幕久久久| 日韩美女视频免费看| 97在线视频观看| 亚洲成人中文字幕| 亚洲黄色www网站| 亚洲三级免费看| 中文字幕欧美精品日韩中文字幕| 91九色视频导航| 国产成人精品免费视频| 国产精品揄拍500视频| 成人妇女免费播放久久久| 美女久久久久久久久久久| 久久久久久久97|