【发布时间】:2020-07-09 19:32:30
【问题描述】:
我需要修改简单的 bash 脚本来遍历文件,并在每个文件的末尾添加一些带有文件变量名称的文本。有一个 Nagios .cfg 文件的例子……到目前为止我得到了这样的东西:
#!/bin/bash
list=$(ls /root/user/test/ | sed "s/\.cfg//")
用于 `/root/user/test/*.cfg` 中的服务器;做
对于$列表;做
回声`
定义服务{
主机名 $list
service_description All_fs_free_space
check_command check_nrpe!check_all_disks!3% 1%
使用用户磁盘
}` >> /etc/nagios3/conf.d/servers/test/$servery
完毕
完成
不幸的是,由于引号没有工作......?有没有更好的解决方案如何实现?谢谢。
Paul Hodges 解决方案的调试输出:
root@bla:~/blabla# ./add2.sh ++ fmt=' 定义服务{ 主机名 %s service_description All_fs_free_space check_command check_nrpe!check_all_disks!3%% 1%% 使用用户磁盘 }' ++ 用于“/root/user/test/*.cfg”中的文件 ++ cfg='*.cfg' ++打印' 定义服务{ 主机名 %s service_description All_fs_free_space check_command check_nrpe!check_all_disks!3%% 1%% 使用用户磁盘 }''*' ./add2.sh:第 14 行:/root/blabla/test/servers/$cfg:不明确的重定向【问题讨论】:
-
通过Shell Check 运行您的脚本。你有几个简单的语法错误。
-
很确定您不希望在
/root/user/test/*.cfg或您的输出周围出现反引号。 -
++ for file in '/root/user/test/*.cfg'和++ cfg='*.cfg'表示在/root/user/test/中没有以cfg结尾的文件名可以循环。如果您希望它跳过循环而没有错误(或任何其他有用的输出),请设置shopt -s nullglob。否则,在处理之前明确测试/root/blabla/test/servers/$cfg的存在,如果不存在则失败。见下文。
标签: bash for-loop nested-loops