linux - shell脚本中的内联变量

标签 linux shell unix

在我的一项要求中,我喜欢在脚本开始时创建命令,并喜欢稍后填充这些变量。例如:

# 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/

相关文章:

linux - 解压缩 .lzo 文件,然后删除 .lzo 文件

linux - 我应该在 spec 文件中的哪个位置添加操作系统,以便生成的 RPM 包含操作系统和架构?

linux - 编写 Sysfs 模块

c - SocketCan Can ID 优先级

c - 在 shell 脚本中将带引号的参数传递给 C 程序

linux - 如何从脚本/手动或通过管道调用编辑和执行命令

unix - awk 替换在 "if"语句中不起作用

linux - du如何估计文件大小?

c - lseek() O(1) 复杂吗?

bash - 如何下载最新版本的 Go