摘要:后來(lái)仔細(xì)查看了資料才發(fā)現(xiàn)自己之前對(duì)單引號(hào)和雙引號(hào)的理解有一些問(wèn)題,在此記錄一些現(xiàn)象和結(jié)果。這個(gè)比較好理解,接下來(lái)我們看下單引號(hào)和雙引號(hào)使用的一些栗子,加深一下我們的理解。
問(wèn)題描述:
????最近在寫(xiě)shell腳本的時(shí)候,涉及到一個(gè)使用shell腳本發(fā)送json數(shù)據(jù)的問(wèn)題,就是發(fā)送的json數(shù)據(jù)雙引號(hào)不見(jiàn)了,導(dǎo)致數(shù)據(jù)格式不正確,收到了錯(cuò)誤的響應(yīng)。后來(lái)仔細(xì)查看了資料才發(fā)現(xiàn)自己之前對(duì)shell單引號(hào)和雙引號(hào)的理解有一些問(wèn)題,在此記錄一些現(xiàn)象和結(jié)果。
問(wèn)題解析:????1.首先,我這邊使用的是bash腳本,放一下bash腳本的手冊(cè)地址;
????2.然后我們看一下官方的手冊(cè)里面是怎么介紹的:
????????2.1 單引號(hào):
Single Quotes: Enclosing characters in single quotes (‘"’) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.
????????翻譯出來(lái)就是:用單引號(hào)(""")括起字符可以保留引號(hào)中每個(gè)字符的字面值。單引號(hào)之間可能不會(huì)出現(xiàn)單引號(hào),即使前面有反斜杠也是如此。
我的理解是單引號(hào)中的值都是會(huì)直接輸出字符或這字符串的字面量,不會(huì)去解析各種變量或者其他的符號(hào),而且必須是成對(duì)出現(xiàn)的。如果兩個(gè)單引號(hào)之間有單引號(hào),或者兩個(gè)單引號(hào)之間有反斜桿的單引號(hào)都是不會(huì)結(jié)束的情況,必須等待新的單引號(hào)出現(xiàn),讓它們成對(duì)了才會(huì)結(jié)束。(__這里的意思是bash的解釋器會(huì)對(duì)單引號(hào)去解析,只有成對(duì)的時(shí)候才會(huì)結(jié)束,否則會(huì)一直等待,所以呢單引號(hào)對(duì)號(hào)都是成對(duì)的使用,雖然我也不知道單個(gè)的單引號(hào)有什么用__)。
下面舉幾個(gè)栗子用來(lái)解釋一下剛才說(shuō)的:
可以看到前兩張圖,輸入了三個(gè)單引號(hào),或者兩個(gè)單引號(hào)之間是一個(gè)帶反斜桿的單引號(hào)。都會(huì)出現(xiàn)>的符號(hào),意思是等待繼續(xù)的輸入。第三張圖輸入了單引號(hào)以后,出現(xiàn)了;號(hào),表示結(jié)束了。說(shuō)明解釋器對(duì)單引號(hào)都是要成對(duì)的去解析。
???? 2.2 雙引號(hào):
Double Quotes Enclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘`’, ‘’, and, when history expansion is enabled, ‘!’. When the shell is in POSIX mode (see Bash POSIX Mode), the ‘!’ has no special meaning within double quotes, even when history expansion is enabled. The characters ‘$’ and ‘`’ retain their special meaning within double quotes (see Shell Expansions). The backslash retains its special meaning only when followed by one of the following characters: ‘$’, ‘`’, ‘"’, ‘’, or newline. Within double quotes, backslashes that are followed by one of these characters are removed. Backslashes preceding characters without a special meaning are left unmodified. A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an ‘!’ appearing in double quotes is escaped using a backslash. The backslash preceding the ‘!’ is not removed. The special parameters ‘*’ and ‘@’ have special meaning when in double quotes (see Shell Parameter Expansion).
大概意思是說(shuō):雙引號(hào)中的信息會(huì)保留字面量,但是同時(shí)會(huì)對(duì)$,`,,這些符號(hào)做出特殊的解析。就是雙引號(hào)中的變量和轉(zhuǎn)義,和函數(shù)操作可以被正常解析出來(lái)。這個(gè)比較好理解,接下來(lái)我們看下單引號(hào)和雙引號(hào)使用的一些栗子,加深一下我們的理解。
實(shí)例:直接上圖:
輸出1,2,應(yīng)該沒(méi)有什么問(wèn)題都是輸出的字面量的字符串。
輸出3,4,就是展示了單引號(hào)和雙引號(hào)的區(qū)別,單引號(hào)繼續(xù)輸出了字符串,而雙引號(hào)輸出了變量a的值。
輸出5,6呢,其實(shí)就是我遇到的問(wèn)題,腳本中需要使用到日期的變量,并且放入到j(luò)son的數(shù)據(jù)中。
輸出5如果直接使用單引號(hào),肯定行不通,因?yàn)椴唤馕鲎兞俊?br>輸出6呢,雖然最外層使用了雙引號(hào),內(nèi)部可以解析變量,但是發(fā)現(xiàn)問(wèn)題沒(méi)有,變量外面是沒(méi)有雙引號(hào)的,而json的數(shù)據(jù)格式是{"key":"value"}。也是不符合的,__原因在于shell解釋器分辨不出來(lái)雙引號(hào)是在第幾層,僅僅查到一堆雙引號(hào)就把它們結(jié)為夫妻(一對(duì)對(duì)的雙引號(hào)進(jìn)行解析),所以輸出6的解析過(guò)程是""{"解析出"{,第二對(duì)雙引號(hào)":"解析出:,第三對(duì)雙引號(hào)"$start_date"解析出start_date的值,依次類推。得出了"{startDay:2019-03-31 00:00:00,endDay:2019-03-31 23:59:59}"__。
輸出7相當(dāng)于就是正確的輸出了json格式的數(shù)據(jù),原理也很簡(jiǎn)單在輸出6已經(jīng)解釋清楚。
1.__寫(xiě)shell腳本的時(shí)候,如果不需要解析里面的內(nèi)容,就使用單引號(hào),反之,雙引號(hào);__
2.__記住shell解析單引號(hào)和雙引號(hào)的規(guī)則,是就近原則,遇到一對(duì)單/雙引號(hào),就會(huì)解析出其中的內(nèi)容,而不是根據(jù)什么最外層,最內(nèi)層這種層級(jí)關(guān)系去解析的,這點(diǎn)要記住。所以在輸入json或者其他的格式的數(shù)據(jù)的時(shí)候,混合使用單/雙引號(hào)的時(shí)候要注意使用的順序,否則得到的結(jié)果并不是你預(yù)想的那樣__
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/25096.html
閱讀 2623·2023-04-26 00:07
閱讀 2432·2021-11-15 11:37
閱讀 639·2021-10-19 11:44
閱讀 2164·2021-09-22 15:56
閱讀 1717·2021-09-10 10:50
閱讀 1497·2021-08-18 10:21
閱讀 2565·2019-08-30 15:53
閱讀 1630·2019-08-30 11:11