最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2015年01月24日 18:16:01   投稿:mdxy-dxy  
空格,一個(gè)看不見的字符,很不起眼,也正由于不起眼,很多人經(jīng)常忽略它,導(dǎo)致代碼出錯,卻還找不著北。這里,我們來聊聊bash中空格的那點(diǎn)事

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

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

我們來看看常見的問題

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

igi@gentoo ~ $ var1 = test
bash: var1: command not found
igi@gentoo ~ $ echo ${var1:?error}
bash: var1: error
igi@gentoo ~ $ echo ${var1?error}
bash: var1: error
igi@gentoo ~ $ var2 =test
bash: var2: command not found
igi@gentoo ~ $ echo ${var2:?error}
bash: var2: error
igi@gentoo ~ $ echo ${var2?error}
bash: var2: error

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

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

igi@gentoo ~ $ var= test
igi@gentoo ~ $ var= nocmd
bash: nocmd: command not found

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

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

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

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

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

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

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

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

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

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

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

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

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

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

a. if 與 [ 之間缺少空格

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

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

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

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

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

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

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

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

igi@gentoo ~ $ if [ 0 ]; then echo 'equal'; fi
equal
igi@gentoo ~ $ if [ "1" ]; then echo 'equal'; fi
equal
igi@gentoo ~ $ if [ "" ]; then echo 'equal'; fi
igi@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), 一起來看看

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

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

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

igi@gentoo ~ $ var=''
igi@gentoo ~ $ if [ "$var" = "abc" ];then echo 'equal'; fi
igi@gentoo ~ $ if [ $var = "abc" ];then echo 'equal'; fi
bash: [: =: unary operator expected
igi@gentoo ~ $ dvar='a b c'
igi@gentoo ~ $ if [ $dvar = "a b c" ];then echo 'equal'; fi
bash: [: too many arguments
igi@gentoo ~ $ if [ "$dvar" = "a b c" ];then echo 'equal'; fi
equal

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

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

相關(guān)文章

  • 在Linux中重命名文件和目錄的幾種方法

    在Linux中重命名文件和目錄的幾種方法

    在這篇基本命令行教程中,你將學(xué)習(xí)在 Linux 終端重命名文件和目錄的各種方法,文中通過代碼示例講解非常詳細(xì),對學(xué)習(xí)Linux重命名文件和目錄非常有幫助,需要的朋友跟著小編一起來學(xué)習(xí)吧
    2024-01-01
  • Shell腳本實(shí)現(xiàn)自動修改IP、主機(jī)名等功能分享

    Shell腳本實(shí)現(xiàn)自動修改IP、主機(jī)名等功能分享

    這篇文章主要介紹了Shell腳本實(shí)現(xiàn)自動修改IP、主機(jī)名等功能分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-12-12
  • Shell實(shí)現(xiàn)日期的獲取、設(shè)置和延時(shí)操作

    Shell實(shí)現(xiàn)日期的獲取、設(shè)置和延時(shí)操作

    本文主要介紹了Shell實(shí)現(xiàn)日期的獲取、設(shè)置和延時(shí)操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • linux shell命令執(zhí)行順序的控制方法

    linux shell命令執(zhí)行順序的控制方法

    有關(guān)linux shell命令執(zhí)行順序的控制辦法,知識點(diǎn)很小,但卻非常實(shí)用,建議朋友們看看
    2013-02-02
  • 關(guān)于shell的幾個(gè)不為人知卻十分有用的命令分享

    關(guān)于shell的幾個(gè)不為人知卻十分有用的命令分享

    這篇文章主要介紹了關(guān)于shell的幾個(gè)不為人知卻十分有用的命令,需要的朋友可以參考下
    2016-03-03
  • expect實(shí)現(xiàn)批量修改linux密碼腳本分享

    expect實(shí)現(xiàn)批量修改linux密碼腳本分享

    這篇文章主要介紹了expect實(shí)現(xiàn)批量修改Linux密碼腳本分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-12-12
  • 關(guān)于vi和vim的區(qū)別及命令詳解

    關(guān)于vi和vim的區(qū)別及命令詳解

    下面小編就就為大家?guī)硪黄P(guān)于vi和vim的區(qū)別及命令詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Shell中特殊字符的用法總結(jié)大全

    Shell中特殊字符的用法總結(jié)大全

    這篇文章主要給大家總結(jié)了關(guān)于Shell中特殊字符的相關(guān)資料,文中包括分好、&、#、!、$、大于號、單雙引號等等一系列特殊字符的用法,通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • shell中數(shù)組的定義及操作

    shell中數(shù)組的定義及操作

    本文主要介紹了shell中數(shù)組的定義及操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • shell獲取命令行參數(shù)示例分享

    shell獲取命令行參數(shù)示例分享

    這篇文章主要介紹了shell獲取命令行參數(shù)示例分享,需要的朋友可以參考下
    2014-03-03

最新評論

高尔夫| 临朐县| 辽宁省| 句容市| 乌兰察布市| 湟中县| 库伦旗| 封开县| 水城县| 桦川县| 前郭尔| 阜新市| 永济市| 西华县| 赣榆县| 临泉县| 翁牛特旗| 武汉市| 营口市| 灵石县| 嘉义市| 扶绥县| 阿尔山市| 米易县| 石首市| 陈巴尔虎旗| 聊城市| 榆林市| 南阳市| 揭西县| 普兰店市| 改则县| 休宁县| 社旗县| 简阳市| 秦皇岛市| 文登市| 双柏县| 迁西县| 盐山县| 武川县|