簡體   English   中英

在雙引號中使用雙引號

[英]Using double quotes within double quotes

我有一個具有以下內容的file1.txt:

time="2016-04-25T17:43:11Z" level=info msg="SHA1 Fingerprint=9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F"

我希望文件看起來如下:

9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F  

實際上,我需要將命令作為字符串傳遞。 這就是為什么bash命令需要封裝在帶雙引號的字符串中的原因。 但是,當我包括

 " grep -Po '(?<=Fingerprint=)[^"]*' "   

我沒有得到想要的輸出。 看來我需要正確地轉義雙引號。

要回答文字問題,可以在命令中使用反斜杠轉義文字雙引號。 但是,由於BashFAQ#50中給出的原因,這是非常糟糕的做法:

# Avoid this absent a very good reason
grep_cmd_str="grep -Po '(?<=Fingerprint=)[^\"]*'" 
eval "$grep_cmd_str" <file1.txt # eval is necessary, with all the issues that implies

in a variable is to use an array , not a scalar variable, to hold its arguments: 當您需要在變量中存儲簡單命令(無重定向或其他shell構造) ,更好的做法是使用數組而不是標量變量來保存其參數:

# Use this principally if you need to dynamically build up an argument list
grep_args=( grep -Po '(?<=Fingerprint=)[^"]*' )
"${grep_args[@]}" <file1.txt

如果您沒有任何要求使用上述任何一種的約束,請考慮一個函數(只要重定向和shell構造經過硬編碼,它就允許重定向和shell構造):

# Use this whenever possible, in preference to the above
grep_fp() { grep -Po '(?<=Fingerprint=)[^"]*' "$@"; }
grep_fp <file1.txt

- Not evaluating shell constructs, in this context, is a security feature: it protects you against malicious filenames or similar content in values which have been substituted into the value you're using as a command. -在這種情況下,不評估外殼結構是一項安全功能:它可以保護您免受惡意文件名或類似內容(已替換為您用作命令的值)中的內容的侵害。

- Note that arrays are not available in POSIX sh, which your question is also tagged for. -請注意,數組在POSIX sh中不可用,您的問題也被標記了。 也就是說,可以通過覆蓋"$@" (大概在有限的范圍內,例如函數,以保留其原始值)來獲得類似的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM