我正在查看此脚本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无法识别$(…)
,因此`…`
必须在较旧的系统上运行的脚本需要使用。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句