【问题标题】:Bash variable substitution when using a command line argument file使用命令行参数文件时的 Bash 变量替换
【发布时间】:2019-06-16 22:34:48
【问题描述】:
FILEDIR=/home/myuserdir/audit
FILE=auditreport.csv

以上变量在我的配置文件中。

我有这个与我拥有的配置文件一起运行的 bash 脚本:

for file in `ls ${FILEDIR}/${FILE}`

它确实看到了我的路径,它进入根目录或/ 目录,而不是进入我的/home/myuserdir/audit 目录。但是如果我在脚本而不是配置文件中声明变量,它可以完美地工作并且找到正确的目录。我究竟做错了什么?不幸的是,我必须使用配置文件运行脚本才能轻松进行自定义。

我已尝试将语句包装在“” 中,但它仍然不起作用。

预期的结果是我希望脚本转到 /home/myuserdir/audit 而不是主目录。

【问题讨论】:

  • 您的 bash 脚本如何访问其配置文件?你是怎么做到的。这似乎就是问题所在。
  • 顺便说一句,请注意 ls ${FILEDIR}/${FILE} 是错误的,只要用户的目录名称带有空格,或者您将 IFS 设置为包含 / 或其他可能存在的值,它就会中断在名字里面;它应该是带有引号的ls "$FILEDIR/$FILE",以防止字符串拆分和全局扩展。 (此外,全大写名称用于对 shell 和 OS 有意义的变量;应用程序定义的名称应至少包含一个小写字符,如 POSIX 标准 pubs.opengroup.org/onlinepubs/9699919799/basedefs/… 中所定义,以避免冲突)。跨度>
  • ...但是,要解决真正的问题,我们需要看看您是如何加载文件的。
  • 请注意for file in $(...)(使用较新的命令替换语法或较旧的基于反引号的语法)也是不好的做法并且容易出错;请参阅BashPitfalls #1ParsingLsDontReadLinesWithFor
  • @Peadove :如果你真的按照你所说的方式运行配置文件 - 你应该在你的帖子中包含这些信息 - 在父 shell 中不应该看到任何变量,因为 Audit.config 将在一个子壳。此外,您的循环没有多大意义。为什么不直接写file="$FILEDIR/$file"

标签: bash variables substitution


【解决方案1】:

您必须获取配置文件,而不仅仅是启动它!

my.config

ConfigFileDir=/home/myuserdir/audit
ConfigFile=auditreport.csv

你的脚本

# source my.config at the top of your script
source my.config

# and use the variables
echo "$ConfigFileDir/$ConfigFile"

【讨论】:

    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2017-02-11
    • 2019-04-05
    • 1970-01-01
    相关资源
    最近更新 更多