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