国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > Linux Shell > 正文

Shell 編程:Bash空格的那點(diǎn)事

2020-07-27 19:08:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

1. 等號(hào)賦值兩邊不能有空格
2. 命令與選項(xiàng)之間需要空格
3. 管道兩邊空格可有可無(wú)

我們來(lái)看看常見(jiàn)的問(wèn)題

1. 賦值時(shí)等號(hào)兩邊或者只有左邊多了空格

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的變量擴(kuò)展,${var1:?error}當(dāng)var1為unset或null(未定義或空)時(shí), 報(bào)指定錯(cuò)誤; ${var1?error}當(dāng)var1為unset時(shí),報(bào)指定錯(cuò)誤 。從執(zhí)行結(jié)果來(lái)看,如果等號(hào)左邊有空格,則變量名當(dāng)成命令執(zhí)行,結(jié)果報(bào)command not found,變量沒(méi)有被賦值

2. 賦值時(shí)等號(hào)左邊沒(méi)有空格,右邊有空格(這種情況有點(diǎn)特別,你會(huì)發(fā)現(xiàn)兩種情況)

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

同樣是等號(hào)右邊有空格,第一條命令沒(méi)報(bào)錯(cuò),而第二條報(bào)錯(cuò)了。
這是因?yàn)閟hell中有這么一種執(zhí)行命令的方式: var=string command
命令command將得到變量var的值(至于在命令執(zhí)行后,變量var的值是否保留下來(lái),bash4中沒(méi)有保留,但我在dash中發(fā)現(xiàn)時(shí)保留下來(lái)的,不 同的shell對(duì)這個(gè)的處理不同), 由于test是個(gè)命令,而nocmd不是,所以報(bào)了command not found.

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

注意: 這里我使用了eval, 是想避免在第一次解析時(shí)$var被替換成空字符串, 不然就會(huì)出現(xiàn)下面的情況(下面是錯(cuò)誤的測(cè)試方法,在echo還沒(méi)執(zhí)行時(shí),$var已經(jīng)被替換成空字符串)

復(fù)制代碼 代碼如下:

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

到這里,相信大家都明白了吧, 對(duì)于等號(hào)賦值,左右兩邊不可以有空格,雖然右邊有空格不一定報(bào)錯(cuò),但那絕對(duì)不是你想要的結(jié)果。

3. 命令和選項(xiàng)之間必須有空格
這個(gè)似乎大家都明白,為何我還這么羅嗦呢?說(shuō)到這里,不得不提一下一個(gè)非常特別的命令: [ 命令(你沒(méi)看錯(cuò),是[ ), 也就是test命令(當(dāng)然bash中,這是個(gè)內(nèi)置命令,但在這里不影響
我們的理解)。或許你會(huì)覺(jué)得[命令眼熟,沒(méi)錯(cuò),我保證你見(jiàn)過(guò)它,來(lái)看看下面的例子

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/[

想起來(lái)了吧?[命令經(jīng)常用到if判斷中,當(dāng)然也有人喜歡這么寫(xiě)

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命令,它們兩者幾乎一樣,為什么不是完全一樣?來(lái)看看這個(gè)

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

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

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

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'

語(yǔ)法分析錯(cuò)誤,很明顯,if[ 對(duì)于bash來(lái)說(shuō),不知道是什么鬼東西

b. [與后面的參數(shù)之間缺少空格

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" 對(duì)于bash來(lái)說(shuō),也不知道是什么鬼東西

c. [ ] 之間的參數(shù)之間缺少空格

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

第一條命令似乎是對(duì)的(實(shí)際上是正巧而已),看看第二條命令"abc" 和 "cba"明顯不同,但卻判斷為相同。這是因?yàn)閰?shù)之間缺少了空格,被[命令認(rèn)為內(nèi)部是個(gè)值而已。看看下面的命令,你就會(huì)釋然

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

在[ ] 內(nèi)部,如果只有一個(gè)值(那些因?yàn)槿鄙倭丝崭穸B一起的也算),不是空字符串就為真。所以在[ ] 之間的參數(shù),也要兩邊有空格,而不能堆一起

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

扯了這么多[命令與空格的事,但有些時(shí)候,缺了空格卻能正確運(yùn)行, 當(dāng)然這只是你好運(yùn), 一起來(lái)看看

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引號(hào)那點(diǎn)事提到過(guò),雙引號(hào)包圍起來(lái)的是一個(gè)整體,而沒(méi)雙引號(hào)的時(shí)候,字符串前后的空格或制表符都被切開(kāi)。如果恰巧你遇到了或者你故意要丟棄字符串前后的空格或制表符,那也不是不可能, 但非常不建議你這么寫(xiě),你的代碼將是非常脆弱的。

或者你該加的空格都加了,但還是報(bào)錯(cuò),這也可能和缺少雙引號(hào)有關(guān)。這樣的情況很普遍,最后再看看

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

我再羅嗦一次,不要輕易省略雙引號(hào)。很清楚了吧?如果你還不明白,
請(qǐng)讀讀Bash引號(hào)那點(diǎn)事

最后,對(duì)于管道兩邊可有可無(wú)的空格,就不扯淡了,因?yàn)闆](méi)遇到有人對(duì)此有疑惑.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 合川市| 潮州市| 金华市| 汉沽区| 会理县| 徐州市| 门源| 新田县| 安龙县| 崇州市| 夏河县| 永昌县| 安新县| 翁牛特旗| 乳山市| 五峰| 北宁市| 五常市| 抚宁县| 邵阳县| 宽甸| 德清县| 威信县| 荣成市| 江西省| 九江市| 那坡县| 仁寿县| 拉萨市| 永定县| 阜阳市| 利津县| 兰考县| 瑞昌市| 乐都县| 淮阳县| 九龙城区| 瑞丽市| 峨山| 广德县| 株洲县|