Bash腳本教程引號(hào)和轉(zhuǎn)義

      網(wǎng)友投稿 1365 2022-05-29

      目錄

      轉(zhuǎn)義

      單引號(hào)

      雙引號(hào)

      Here 文檔

      Here 字符串

      轉(zhuǎn)義

      某些字符在 Bash 里面有特殊含義(比如$、&、*)。

      $ echo $date

      $

      上面例子中,輸出$date不會(huì)有任何結(jié)果,因?yàn)?是一個(gè)特殊字符。

      如果想要原樣輸出這些特殊字符,就必須在它們前面加上反斜杠,使其變成普通字符。這就叫做“轉(zhuǎn)義”(escape)。

      $ echo $date

      $date

      上面命令中,只有在特殊字符$前面加反斜杠,才能原樣輸出。

      反斜杠本身也是特殊字符,如果想要原樣輸出反斜杠,就需要對(duì)它自身轉(zhuǎn)義,連續(xù)使用兩個(gè)反斜線(\)。

      $ echo \

      \

      上面例子輸出了反斜杠本身。

      反斜杠除了用于轉(zhuǎn)義,還可以表示一些不可打印的字符。

      \a:響鈴

      \b:退格

      \n:換行

      \r:回車(chē)

      \t:制表符

      如果想要在命令行使用這些不可打印的字符,可以把它們放在引號(hào)里面,然后使用echo命令的-e參數(shù)。

      $ echo a\tb

      atb

      $ echo -e "a\tb"

      a b

      上面例子中,命令行直接輸出不可打印字符\t,Bash 不能正確解釋。必須把它們放在引號(hào)之中,然后使用echo命令的-e參數(shù)。

      換行符是一個(gè)特殊字符,表示命令的結(jié)束,Bash 收到這個(gè)字符以后,就會(huì)對(duì)輸入的命令進(jìn)行解釋執(zhí)行。換行符前面加上反斜杠轉(zhuǎn)義,就使得換行符變成一個(gè)普通字符,Bash 會(huì)將其當(dāng)作空格處理,從而可以將一行命令寫(xiě)成多行。

      $ mv \

      /path/to/foo \

      /path/to/bar

      # 等同于

      $ mv /path/to/foo /path/to/bar

      上面例子中,如果一條命令過(guò)長(zhǎng),就可以在行尾使用反斜杠,將其改寫(xiě)成多行。這是常見(jiàn)的多行命令的寫(xiě)法。

      單引號(hào)

      Bash 允許字符串放在單引號(hào)或雙引號(hào)之中,加以引用。

      單引號(hào)用于保留字符的字面含義,各種特殊字符在單引號(hào)里面,都會(huì)變?yōu)槠胀ㄗ址热缧翘?hào)(*)、美元符號(hào)($)、反斜杠(\)等。

      $ echo '*'

      *

      $ echo '$USER'

      $USER

      $ echo '$((2+2))'

      $((2+2))

      $ echo '$(echo foo)'

      $(echo foo)

      上面命令中,單引號(hào)使得 Bash 擴(kuò)展、變量引用、算術(shù)運(yùn)算和子命令,都失效了。如果不使用單引號(hào),它們都會(huì)被 Bash 自動(dòng)擴(kuò)展。

      由于反斜杠在單引號(hào)里面變成了普通字符,所以如果單引號(hào)之中,還要使用單引號(hào),不能使用轉(zhuǎn)義,需要在外層的單引號(hào)前面加上一個(gè)美元符號(hào)($),然后再對(duì)里層的單引號(hào)轉(zhuǎn)義。

      # 不正確

      $ echo it's

      # 不正確

      $ echo 'it\'s'

      # 正確

      $ echo $'it\'s'

      不過(guò),更合理的方法是改在雙引號(hào)之中使用單引號(hào)。

      $ echo "it's"

      it's

      雙引號(hào)

      雙引號(hào)比單引號(hào)寬松,大部分特殊字符在雙引號(hào)里面,都會(huì)失去特殊含義,變成普通字符。

      $ echo "*"

      *

      上面例子中,通配符*是一個(gè)特殊字符,放在雙引號(hào)之中,就變成了普通字符,會(huì)原樣輸出。這一點(diǎn)需要特別留意,這意味著,雙引號(hào)里面不會(huì)進(jìn)行文件名擴(kuò)展。

      但是,三個(gè)特殊字符除外:美元符號(hào)($)、反引號(hào)(`)和反斜杠(\)。這三個(gè)字符在雙引號(hào)之中,依然有特殊含義,會(huì)被 Bash 自動(dòng)擴(kuò)展。

      $ echo "$SHELL"

      /bin/bash

      $ echo "`date`"

      Mon Jan 27 13:33:18 CST 2020

      上面例子中,美元符號(hào)($)和反引號(hào)(`)在雙引號(hào)中,都保持特殊含義。美元符號(hào)用來(lái)引用變量,反引號(hào)則是執(zhí)行子命令。

      $ echo "I'd say: \"hello!\""

      I'd say: "hello!"

      $ echo "\"

      \

      上面例子中,反斜杠在雙引號(hào)之中保持特殊含義,用來(lái)轉(zhuǎn)義。所以,可以使用反斜杠,在雙引號(hào)之中插入雙引號(hào),或者插入反斜杠本身。

      換行符在雙引號(hào)之中,會(huì)失去特殊含義,Bash 不再將其解釋為命令的結(jié)束,只是作為普通的換行符。所以可以利用雙引號(hào),在命令行輸入多行文本。

      $ echo "hello

      world"

      hello

      world

      上面命令中,Bash 正常情況下會(huì)將換行符解釋為命令結(jié)束,但是換行符在雙引號(hào)之中就失去了這種特殊作用,只用來(lái)?yè)Q行,所以可以輸入多行。echo命令會(huì)將換行符原樣輸出,顯示的時(shí)候正常解釋為換行。

      雙引號(hào)的另一個(gè)常見(jiàn)的使用場(chǎng)合是,文件名包含空格。這時(shí)就必須使用雙引號(hào),將文件名放在里面。

      $ ls "two words.txt"

      上面命令中,two words.txt是一個(gè)包含空格的文件名,否則就會(huì)被 Bash 當(dāng)作兩個(gè)文件。

      雙引號(hào)會(huì)原樣保存多余的空格。

      $ echo "this is a test"

      this is a test

      Bash腳本教程之引號(hào)和轉(zhuǎn)義

      雙引號(hào)還有一個(gè)作用,就是保存原始命令的輸出格式。

      # 單行輸出

      $ echo $(cal)

      一月 2020 日 一 二 三 四 五 六 1 2 3 ... 31

      # 原始格式輸出

      $ echo "$(cal)"

      一月 2020

      日 一 二 三 四 五 六

      1 2 3 4

      5 6 7 8 9 10 11

      12 13 14 15 16 17 18

      19 20 21 22 23 24 25

      26 27 28 29 30 31

      上面例子中,如果$(cal)不放在雙引號(hào)之中,echo就會(huì)將所有結(jié)果以單行輸出,丟棄了所有原始的格式。

      Here 文檔

      Here 文檔(here document)是一種輸入多行字符串的方法,格式如下。

      << token

      text

      token

      它的格式分成開(kāi)始標(biāo)記(<< token)和結(jié)束標(biāo)記(token)。開(kāi)始標(biāo)記是兩個(gè)小于號(hào) + Here 文檔的名稱(chēng),名稱(chēng)可以隨意取,后面必須是一個(gè)換行符;結(jié)束標(biāo)記是單獨(dú)一行頂格寫(xiě)的 Here 文檔名稱(chēng),如果不是頂格,結(jié)束標(biāo)記不起作用。兩者之間就是多行字符串的內(nèi)容。

      下面是一個(gè)通過(guò) Here 文檔輸出 HTML 代碼的例子。

      $ cat << _EOF_

      </p><p>The title of your page</p><p>

      Your page content goes here.

      _EOF_

      Here 文檔內(nèi)部會(huì)發(fā)生變量替換,同時(shí)支持反斜杠轉(zhuǎn)義,但是不支持通配符擴(kuò)展,雙引號(hào)和單引號(hào)也失去語(yǔ)法作用,變成了普通字符。

      $ foo='hello world'

      $ cat << _example_

      $foo

      "$foo"

      '$foo'

      _example_

      hello world

      "hello world"

      'hello world'

      上面例子中,變量$foo發(fā)生了替換,但是雙引號(hào)和單引號(hào)都原樣輸出了,表明它們已經(jīng)失去了引用的功能。

      如果不希望發(fā)生變量替換,可以把 Here 文檔的開(kāi)始標(biāo)記放在單引號(hào)之中。

      $ foo='hello world'

      $ cat << '_example_'

      $foo

      "$foo"

      '$foo'

      _example_

      $foo

      "$foo"

      '$foo'

      上面例子中,Here 文檔的開(kāi)始標(biāo)記(_example_)放在單引號(hào)之中,導(dǎo)致變量替換失效了。

      Here 文檔的本質(zhì)是重定向,它將字符串重定向輸出給某個(gè)命令,相當(dāng)于包含了echo命令。

      $ command << token

      string

      token

      # 等同于

      $ echo string | command

      上面代碼中,Here 文檔相當(dāng)于echo命令的重定向。

      所以,Here 字符串只適合那些可以接受標(biāo)準(zhǔn)輸入作為參數(shù)的命令,對(duì)于其他命令無(wú)效,比如echo命令就不能用 Here 文檔作為參數(shù)。

      $ echo << _example_

      hello

      _example_

      上面例子不會(huì)有任何輸出,因?yàn)?Here 文檔對(duì)于echo命令無(wú)效。

      此外,Here 文檔也不能作為變量的值,只能用于命令的參數(shù)。

      Here 字符串

      Here 文檔還有一個(gè)變體,叫做 Here 字符串(Here string),使用三個(gè)小于號(hào)(<<<)表示。

      <<< string

      它的作用是將字符串通過(guò)標(biāo)準(zhǔn)輸入,傳遞給命令。

      有些命令直接接受給定的參數(shù),與通過(guò)標(biāo)準(zhǔn)輸入接受參數(shù),結(jié)果是不一樣的。所以才有了這個(gè)語(yǔ)法,使得將字符串通過(guò)標(biāo)準(zhǔn)輸入傳遞給命令更方便,比如cat命令只接受標(biāo)準(zhǔn)輸入傳入的字符串。

      $ cat <<< 'hi there'

      # 等同于

      $ echo 'hi there' | cat

      上面的第一種語(yǔ)法使用了 Here 字符串,要比第二種語(yǔ)法看上去語(yǔ)義更好,也更簡(jiǎn)潔。

      $ md5sum <<< 'ddd'

      # 等同于

      $ echo 'ddd' | md5sum

      上面例子中,md5sum命令只能接受標(biāo)準(zhǔn)輸入作為參數(shù),不能直接將字符串放在命令后面,會(huì)被當(dāng)作文件名,即md5sum ddd里面的ddd會(huì)被解釋成文件名。這時(shí)就可以用 Here 字符串,將字符串傳給md5sum命令。

      下一節(jié)Bash腳本教程之變量

      Bash

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:DEDE織夢(mèng)標(biāo)簽dede:arclist 詳解
      下一篇:【技術(shù)補(bǔ)給站】第1期:重磅發(fā)布!《IT2.0時(shí)代,華為全場(chǎng)景驅(qū)動(dòng)下中臺(tái)規(guī)劃實(shí)戰(zhàn)全集》
      相關(guān)文章
      亚洲日韩精品无码专区网址 | 亚洲高清无码在线观看| 亚洲美女免费视频| 亚洲免费人成在线视频观看| 国产亚洲精品美女久久久久| 亚洲最大的成人网| 亚洲无圣光一区二区| 久久久久无码精品亚洲日韩| 亚洲国产一区二区视频网站| 国产91在线|亚洲| 亚洲精品视频久久| 亚洲国产精品一区| 久久精品国产亚洲av成人| 亚洲一区二区精品视频| 国产亚洲精品国产福利在线观看| 亚洲综合成人婷婷五月网址| 亚洲成人黄色在线观看| 亚洲AV无码日韩AV无码导航| 亚洲一区二区三区自拍公司| 亚洲精品久久久www| 国产精品亚洲精品日韩电影| 亚洲av无码有乱码在线观看| 亚洲国产乱码最新视频| 亚洲av专区无码观看精品天堂| 久久久无码精品亚洲日韩京东传媒 | 亚洲中文精品久久久久久不卡| 亚洲欧洲日韩极速播放 | 亚洲毛片αv无线播放一区| 国产精品亚洲片在线观看不卡| 亚洲AV无码一区二区乱孑伦AS | 97亚洲熟妇自偷自拍另类图片| 亚洲成人一级电影| 国产亚洲sss在线播放| 亚洲成a人无码亚洲成www牛牛| 国产精品亚洲专区在线播放| 国产亚洲精品自在线观看| 国产亚洲真人做受在线观看| 日本久久久久亚洲中字幕| 亚洲依依成人精品| 亚洲av色香蕉一区二区三区蜜桃| 亚洲 综合 国产 欧洲 丝袜|