如何在包含变量的命令中解析引号

时间:2015-07-16 03:45:27

标签: bash

在一个简单的shell脚本中考虑以下内容,该脚本用于转储mysql dbtable:

int

如何正确解析/引用上述命令?

在-x模式下运行会显示以下内容:

valueOf()

它仍然可以工作,但似乎看起来不引用非引用的参数,并且密码参数上的单引号包含整个参数?!?

为什么,Bash,为什么?!?

1 个答案:

答案 0 :(得分:3)

双引号和单引号并不神奇。它们只是保护shell不以其他方式解释内容。

单引号可防止shell解释其中的任何内容。在单引号字符串中唯一特殊的是单引号并结束字符串。

双引号可防止文件名通配等,但允许变量扩展等。

两个引号都会阻止shell进行单词拆分(将输入分解为空格上的单词)。

这一行

echo foo bar baz

是shell的四个字。

这两个

echo "foo bar baz"
echo 'foo bar baz'

是两个"单词"。

删除引号后,任何触及的单词都会被shell组合在一起,所以这也是两个单词"

echo "foo bar"' baz'

现在让我们看看你的例子

mysqldump --host='dbhost.com' --user=someUser -p'somePW' dbName  --no-create-info --single-transaction --tables user --where="id=${USER_ID}" > account_data/user.sql
mysqldump --host=dbhost.com --user=someUser '-psomePW' dbname --no-create-info --single-transaction --tables user --where=id=283

假设USER_ID的值为283

展开变量并从两者中删除引号,我们得到

mysqldump --host=dbhost.com --user=someUser -psomePW dbName  --no-create-info --single-transaction --tables user --where=id=${USER_ID} > account_data/user.sql
mysqldump --host=dbhost.com --user=someUser -psomePW dbname --no-create-info --single-transaction --tables user --where=id=283

你知道为什么两者的引用都是一样的。他们最终得到了相同的结果。

引用完全在命令执行之前。该命令不会看到引号,只能看到变量本身。

如果你在shell中运行set -x,shell将显示在运行它们时将要运行的命令(以显示"单词"它看到的)的格式。

您如何选择引用--host='dbhost.com'这样的参数取决于个人风格和价值。这些报价是不必要的。它们可以有效地绕过整个字符串('--host=dbhost.com')或任意地围绕参数的任何部分(--hos't='dbhost.com)。

如果您想详细了解所有这些内容的详细信息,请阅读POSIX规范的Shell Command Language部分。