簡體   English   中英

如何保留雙引號 arguments 傳遞給 bash 腳本?

[英]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.

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