在一个简单的shell脚本中考虑以下内容,该脚本用于转储mysql dbtable:
int
如何正确解析/引用上述命令?
在-x模式下运行会显示以下内容:
valueOf()
它仍然可以工作,但似乎看起来不引用非引用的参数,并且密码参数上的单引号包含整个参数?!?
为什么,Bash,为什么?!?
答案 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部分。