在我的一项要求中,我喜欢在脚本开始时创建命令,并喜欢稍后填充这些变量。例如:
# 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
周围加上反引号,导致该变量的值在赋值时存在被字符串拆分、glob 扩展,然后运行一个命令,该命令的输出(大概是一个空字符串)被替换到位。 - 它的尾部有一个不匹配的反引号,使其语法无效。
关于linux - shell脚本中的内联变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35234700/