Python 的標準庫有一個shlex.quote函式,它接受一個字串并回傳一個保證被 Unix shell 解釋為相同字串的字串。這是通過將字串放在單引號中并轉義出現在其中的任何單引號字符來實作的。
此函式很有用,例如,當您模板化 shell 腳本并且不能保證替換值僅包含“shell 安全”字串時。
我的問題:是否有一個用純 bash 撰寫的等價物,最多 coreutils 作為依賴項?或者甚至是我不知道的 bash 內置機制?
展示如何使用此類實用程式的最小示例(shlex_quote此處稱為占位符):
generate_greeting_script.sh:
#!/bin/bash
cat > greet.sh <<HEREDOC
#!/bin/bash
greeting=$(shlex_quote "$1")
echo "\$greeting \$(whoami)!"
HEREDOC
chmod x greet.sh
$ ./generate_greeting_script.sh "'ello"
$ ./greet.sh
'ello govnah!
shlex_quote使用 Python 的實用程式可以很好地作業shlex.quote,但是僅僅為此而將 Python 作為依賴項是矯枉過正的。
uj5u.com熱心網友回復:
由于您指的是 bash,因此您可以在 bash 中使用特定格式字符“q” printf:
$ printf '%q\n' "The world is fuiled by \$s isn't it?"
The\ world\ is\ fuiled\ by\ \$s\ isn\'t\ it\?
從 bash 的檔案中:
%q
使 printf 以可重復用作 shell 輸入的格式輸出相應的引數。
https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html
uj5u.com熱心網友回復:
我認為您正在尋找特定于 Bash 的 printf%q格式說明符:
$ read && printf "%q\n" "$REPLY"
"very*complicated_&&;$stuff--string'""""'"<<!!
\"very\*complicated_\&\&\;\$stuff--string\'\"\"\"\"\'\"\<\<\!\!
$ echo \"very\*complicated_\&\&\;\$stuff--string\'\"\"\"\"\'\"\<\<\!\!
"very*complicated_&&;$stuff--string'""""'"<<!!
uj5u.com熱心網友回復:
或者使用@Q變數擴展
cat generate_greeting_script:
#!/usr/bin/env bash
cat >greet <<HEREDOC
#!/usr/bin/env bash
printf ${1@Q}' %s!\n' "\$USER"
HEREDOC
chmod x greet
./generate_greeting_script 'I say hello to'
.sh不需要對帶有 shebang 的可執行腳本進行擴展。
生成greet:
#!/usr/bin/env bash
printf 'I say hello to'' %s!\n' "$USER"
輸出:
./greet
I say hello to lea!
參考man bash:
${parameter@operator}引數轉換。
擴展要么是引數值的轉換,要么是有關引數本身的資訊,具體取決于運算子的值。每個運算子都是一個字母:
Q擴展是一個字串,它是以可重復用作輸入的格式參考的引數值。
uj5u.com熱心網友回復:
將參考的內容放入$1變數中greeting:
printf -v greeting '%q' "$1"
它使用 Bash 特定的-v選項和%q格式字串printf。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/420215.html
標籤:
