繁体   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