Bash读取含变量引用的命令字符串,变量无法展开问题
解决bash读取含变量的命令文件后无法展开变量的问题
问题核心
你遇到的问题本质是:用MYVAR=$(<command.in)读取文件内容时,bash仅将文件内容作为纯字符串存储到变量中,不会主动解析其中的变量引用。哪怕后续定义了DIR,执行$MYVAR时,bash只会把字符串拆分为命令和参数,不会重新处理其中的$DIR。
可行解决方案
方案1:使用eval强制解析变量
通过eval命令让bash重新解析字符串中的变量引用,注意要提前定义好所需变量:
#!/bin/bash DIR="/tmp" MYVAR=$(<command.in) eval "$MYVAR"
注意:
eval会执行字符串中的任意命令,若文件内容不可信,存在安全风险。
方案2:直接source命令文件(推荐)
如果command.in中的内容是合法的bash命令,直接用source(或.)执行该文件,bash会自然解析其中的变量:
#!/bin/bash DIR="/tmp" source command.in # 等价写法:. command.in
这种方式更安全可控,避免了eval的潜在风险。
为什么之前的尝试无效
- 提前定义
DIR:MYVAR=$(<command.in)读取文件时,bash不会展开字符串里的$DIR,变量存储的仍是ls $DIR原样,执行时$DIR会被当作未定义的空变量处理。 - 改成
${DIR}:只是变量引用的语法变化,本质还是未被解析的字符串,无法解决问题。 - 改成
$(DIR):这是命令替换语法,会尝试执行DIR命令(不存在该命令),和变量展开无关。
内容的提问来源于stack exchange,提问作者SailorCire
相关产品推荐
相关产品推荐

