【发布时间】: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 #1、ParsingLs 和 DontReadLinesWithFor。 -
@Peadove :如果你真的按照你所说的方式运行配置文件 - 你应该在你的帖子中包含这些信息 - 在父 shell 中不应该看到任何变量,因为 Audit.config 将在一个子壳。此外,您的循环没有多大意义。为什么不直接写
file="$FILEDIR/$file"?
标签: bash variables substitution