为什么在Shell脚本中使用双引号和反引号?

斯坦恩

我正在查看此脚本mysql备份脚本,但我不明白在命令名周围同时使用反引号和双引号的原因是什么?

379 WHICH="`which which`"
380 AWK="`${WHICH} gawk`"
381 LOGGER="`${WHICH} logger`"
382 ECHO="`${WHICH} echo`"
383 CAT="`${WHICH} cat`"
384 BASENAME="`${WHICH} basename`"
385 DATEC="`${WHICH} date`"
386 DU="`${WHICH} du`"
387 EXPR="`${WHICH} expr`"
388 FIND="`${WHICH} find`"
389 RM="`${WHICH} rm`"
390 MYSQL="`${WHICH} mysql`"
391 MYSQLDUMP="`${WHICH} mysqldump`"
392 GZIP="`${WHICH} gzip`"
393 BZIP2="`${WHICH} bzip2`"
394 CP="`${WHICH} cp`"
395 HOSTNAMEC="`${WHICH} hostname`"
396 SED="`${WHICH} sed`"
397 GREP="`${WHICH} grep`"

更新:

"`${WHICH} gawk`"

几乎与

"${${WHICH} gawk}"
吉勒斯“别再邪恶了”

WHICH="`which which`"完全等于WHICH=`which which`等于WHICH=$(which which)WHICH="$(which which)"所有这些都运行命令which which,并将其输出(作为字符串)捕获到变量中WHICH,从输出中剥离所有最终的换行符。类似地,AWK="`${WHICH} gawk`"可以写成AWK=`$WHICH gawk`

通常,如果结果包含空格或shell通配符(,则命令替换(`command`$(command))应该用双引号引起来*?[\这是因为命令替换的结果(如变量替换($foo${foo}))经历了单词拆分和文件名生成(又称“通配”)。但是,这不适用于简单的变量分配:由于上下文需要单个单词,因此替换结果保持原样。因此,分配是一般规则的例外,您应将变量和命令替换双引号。(请注意,此例外不会扩展到export var="$value",但确实需要使用双引号。)但是,始终将双引号作为一种合理的shell编程实践-仅在知道您必须时才省略双引号,而不是仅在您知道必须时才使用双引号。

在(不太可能)which which返回带有空格或通配符的路径的情况下${WHICH}应在下面的行中用双引号将其括起来,即

AWK="`"${WHICH}" gawk`"
AWK=`"${WHICH}" gawk`
AWK="$("${WHICH}" gawk)"
AWK=$("${WHICH}" gawk)

$(…)建议重新使用`…`,因为很难在内部获得嵌套的引用`…`。但是,非常旧的shell无法识别$(…),因此`…`必须在较旧的系统上运行的脚本需要使用。)

另请参见$ VAR与$ {VAR},并引用或不引用

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在[[]]测试中使用双引号?

在shell脚本中使用$()代替反引号有什么好处?

何时在MySQL中使用单引号,双引号和反引号

在Bash中在双引号和单引号中使用反引号的区别

在脚本中使用反引号

Sqlite-在Python中使用反引号(`)或双引号(“)

为什么Unix手册页使用双反引号代替双引号?

在 bash 脚本中使用双引号和单引号来调用程序

如何在脚本化的ssh命令中使用单引号和双引号

在bash shell脚本中使用反引号执行命令

为什么在Java正则表达式中使用单反和三反斜杠转义双引号会产生相同的结果

在Excel中使用双引号和if条件

在wpdb select中使用双引号和单引号

在命令中使用引号和双引号设置别名

在Java Runtime中使用引号和双引号.getRuntime()。exec(...)

如何在JavaScript中使用单引号和双引号

为什么bash实际上使用单引号和双引号?

为什么在Shell脚本中定义此变量需要双引号?

为什么我的双引号是单引号?

如何在shell脚本中使用双引号传递变量值

在awk中使用双引号

为什么要在Powershell中使用两套双引号来使用find?

为什么 make 在目标名称周围使用反引号和单引号?

在python字典中使用单引号和双引号有什么区别(如果有)?

为什么要在html输入标签属性值中使用双引号?

将带有单引号和双引号的参数传递给 shell 脚本

命令替换和双引号:为什么结果不同?

为什么Elixir指南说要在宏定义中使用引号和取消引号

Bash shell脚本。变量作为参数。无引号与双引号