在我的一个需求中,我喜欢在脚本开始时创建命令,并喜欢稍后填充这些变量。例如:
# Global
Mylistdir="ls -la $MYDAIR"
#now after some code I want to create this variable
MYDAIR="/data/dir/"
#Now like to run taht command on /data/dir
echo "$Mylistdir"
我该怎么做?
我试过了
Mylistdir="ls -la `$MYDAIR`"`
但没用。
最佳答案
代码应该存储在函数中,而不是变量中。请参阅BashFAQ #50以获取基本原理的完整描述,以及忽略此规则所导致的错误。
Mylistdir() { ls -la "$MYDAIR"; }
MYDAIR=/data/dir
Mylistdir
如果必须在变量中存储代码,请使用
eval
:Mylistdir='ls -la "$MYDAIR"'
MYDAIR=/data/dir
eval "$Mylistdir"
…但请注意BashFAQ #48中给出的警告。
问题中提出的原始守则如下:
Mylistdir="ls -la `$MYDAIR`"`
……现在,这已经被打破了,有几个原因:
它在外部使用双引号,导致在赋值时立即执行任何扩展,而不是在以后的求值时执行。
它将回退放在
$MYDAIR
,导致赋值时存在的变量的值为字符串拆分、GLUB展开,然后作为命令运行,该命令的输出(大概是空字符串)代替了。它的结尾有一个尾随的、不匹配的倒勾,这使得它的语法无效。