shell 参数可以用单引号和双引号以外的字符括起来吗?

shell 参数可以用单引号和双引号以外的字符括起来吗?

我有一个脚本,它采用 MySQL SELECT 查询作为其唯一参数。通常,我将该查询括在单引号中,并在查询中使用双引号来括起作为查询本身参数的字符串。

有时,这会出现问题,通常是当查询本身必须搜索引号字符(单引号或双引号)时。我确信可以通过正确转义单引号和双引号来解决这个问题,但这很棘手,因为 MySQL 和 Linux shell 可能使用不同的转义方法。


例子...这是一个例子,对我来说似乎非常困难......它需要找到前面有反斜杠的单引号字符。请注意,此示例无意转义 MySQL 或 CLI 的任何字符。百分号在 MySQL 中充当通配符。

./show-results 'SELECT * FROM `table` WHERE `column` LIKE "%\'%"'


是否可以使用单引号或双引号以外的其他内容来括起 shell 参数?

答案1

您没有提供示例,所以我不确定这是否适合您。

使用此处的文档:

echo "$(cat <<'EOF'
foo "x" bar 'x'
EOF
)"

当你运行这个命令时,set -x你会发现 bash 会为你转义:

+ echo 'foo "x" bar '\''x'\'''
foo "x" bar 'x'

现在用你的样本:

./show-results "$(cat <<'EOF'
SELECT * FROM `table` WHERE `column` LIKE "%\'%"
EOF
)"

产生正确的转义参数:

./show-results 'SELECT * FROM `table` WHERE `column` LIKE "%\'\''%"'

第一个反斜杠在内部,''因此它不充当转义符并导致\第二个反斜杠在外部'',用于转义单个'

相关内容