shell中的引號使用


Linux 中引號使用

由於對bash中的特殊符號不太了解,導致在使用命令或寫腳本時總覺得有些錯誤莫名其妙,有些結果不如人所願,幾經嘗試,不斷百度,才能得到想要的結果。因此將剛剛遇到的問題進行查閱整理,以便加強記憶。 在進行一些linux命令操作時,經常使用正則表達式,對輸出結果進行過濾,如存在如下文件:

# i am comment i am normal line 

希望通過正則表達式,只輸出第二行,將第一行的注釋行過濾:

cat test | grep -P ^(?!#) 運行結果: cat test | grep -P ^(?cat test | grep -P ^(?) -bash: 未預期的符號 `(' 附近有語法錯誤 

查找失敗,命令運行失敗。而以同樣的方式,過濾掉非注釋行,只輸出注釋行:

cat test | grep -P ^# 運行結果: # i am comment 

則運行成功,能夠正常查找到注釋行。因為非注釋行的正則表達式(不以'#'字符開頭):

^(?!#) 

中含有特殊字符!#,被bash或sh解釋器重新解釋,因此grep收到的正則表達式不是我們預想輸入的結果。因此執行:cat test | grep -P ^(?!#)會不是預想的結果,甚至報錯。根據錯誤提示,可以知道,bash將!#解釋成之前的字符串,即cat test | grep -P ^(?。 特殊符號參考

鑒於上述情況,可以使用引號來解決問題,接下來介紹常用的三種引號:單引號,雙引號,外引號。

1. 單引號

單引號括起來的所有字符,均作為普通字符處理,引號內禁止變量擴展。即bask等解釋器不會關注單引號中的字符形式,不會對單引號中的字符進行重新解釋。因此可以使用單引號解決上面的過濾非注釋行的問題。修改為:

cat test | grep -P '^(?!#)' 運行結果: i am normal line 

符合預期

2. 雙引號

部分引用,引號內可以進行符號擴展,$(美元符號)、"(雙引號)、\(反斜線)均保留其特殊功能:

$: 取變其后指定變量的值來代替變量和$符號,當變量與相鄰的字符有其他含義時,需要使用{}將變量名括起來,作為一個整體。 \: 轉義符號,使解釋器將轉義符后的字符按照普通字符處理,不進行擴展。 ": 部分引用,想在雙引號中引用 " ,需要在其前面加上 \ 轉義符號。 

有時為保持變量的完整性,不想被空格擴展為多個參數時,需要將完整變量使用雙引號括起來:

#!/bin/bash function func1() { echo $1 } function func2() { func1 $1 } func2 "hello func" 運行結果: hello 

與預期的hello func不符,原因是在func2中調用func1中時,解釋器將調用fun1的參數按照空格分隔成多個參數,如果想保持參數的完整性,則:

#!/bin/bash function func1() { echo $1 } function func2() { func1 "$1" } func2 "hello func" 運行結果: hello func 

3. 反引號

反引號內的字符串被解釋成命令行,bash解釋器將命令行的執行輸出結果,替換反引號及其包含的部分,因此大多是右值,將命令的輸出結果賦值給其他變量:

test_string=`echo $HOME` echo $test_string 運行結果: /home/pateo 

還能使用雙引號,將多個命令的輸出結果組成一個字符串:

test_string="`echo $HOME`+`ls .`" echo $test_string 運行結果: /home/pateo+test 

4. $()

與反引號作用相同,反引號是老的用法,而$()是新用法,推薦使用。

test_string=$(echo $HOME) echo $test_string 運行結果: /home/pateo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM