[英]How to preserve doubles quoted arguments passed to a bash script?
我試圖通過傳遞一些 arguments 來運行 a.sh 文件。 該文件包含以下內容。
# escape special characters
ESCAPED_REPLACE=$(printf '%s ' "$@" | sed -e 's/[$()"]/\\&/g')
echo "After replace"
echo $ESCAPED_REPLACE
npx codeceptjs "$ESCAPED_REPLACE" --plugins allure
以下是 arguments 的示例列表。 如圖所示,最后一個參數包含雙引號。 我需要在這里保存
./test.sh run --steps --grep "Verifying login"
問題是一旦我打印 ESCAPED_REPLACE 引號就會丟失。 有誰知道為什么?
正確打印傳遞給腳本的報價。 但是,在您的示例./test.sh run --steps --grep "Verifying login"
中,您不會將任何引號傳遞給腳本,因為 bash 會在test.sh
甚至運行之前解釋它們。
要將引號傳遞給腳本,您必須轉義它們:
./test.sh run --steps --grep "\"Verifying login\""
無論如何,我不確定你是否真的需要sed -e 's/[$()"]/\\&/g'
。對我來說,這似乎是對 bash 如何解釋特殊符號的誤解。當你寫"$variable"
variable
內的特殊符號不會被解釋。因此,您通常不必引用variable
的內容。我假設以下工作:
test.sh
的內容
#! /bin/sh
npx codeceptjs "$@" --plugins allure
執行
./test.sh run --steps --grep "Verifying login"
你可以做類似的事情:
#!/bin/bash
# file name: test
echo "K: ${@@K}"
echo "find ${@@K}"
eval "find ${@@K}"
這應該傳遞所有內容來find
,就像您直接鍵入它一樣
$ ./test ../Downloads -name "This is a test.pdf"
K: '../Downloads' '-name' 'This is a test.pdf'
find '../Downloads' '-name' 'This is a test.pdf'
../Downloads/This is a test.pdf
如果我正確地閱讀了您的問題,那就是您正在嘗試做的事情。 特殊字符將在 shell 中解釋,然后再將它們傳遞給您的腳本,除非您先對其進行轉義:
$./test \$var1 "\$var2 \$var3" '$var4 single quotes work too'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.