Bash 带有输出文本变量的嵌套for循环
我需要修改简单的bash脚本来遍历一个文件,并使用file变量的名称在每个文件的末尾添加一些文本。这里有一个Nagios.cfg文件的示例……到目前为止,我得到了如下内容: #!/bin/bash list=$(ls /root/user/test/ | sed "s/\.cfg//") for servery in `/root/user/test/*.cfg`; do for $list; do echo ` define service { host_name $list service_description All_fs_free_space check_command check_nrpe!check_all_disks!3% 1% use user-disk }` >> /etc/nagios3/conf.d/servers/test/$servery done done #!/bin/bash 列表=$(ls/root/user/test/| sed“s/\.cfg/”) 对于“/root/user/test/*.cfg”中的服务器;做 美元名单;做 回音` 定义服务{ 主机名$列表 服务描述所有可用空间 check\u命令check\u nrpe!检查所有磁盘!3%1% 使用用户磁盘 }`>>/etc/nagios3/conf.d/servers/test/$servery 完成 完成 不幸的是,由于引号的缘故,它不起作用了。。。?有没有更好的解决方案来实现这一点?多谢各位 Paul Hodges解决方案的调试输出: root@bla:~/blabla# ./add2.sh ++ fmt=' define service { host_name %s service_description All_fs_free_space check_command check_nrpe!check_all_disks!3%% 1%% use user-disk }' ++ for file in '/root/user/test/*.cfg' ++ cfg='*.cfg' ++ printf ' define service { host_name %s service_description All_fs_free_space check_command check_nrpe!check_all_disks!3%% 1%% use user-disk }' '*' ./add2.sh: line 14: /root/blabla/test/servers/$cfg: ambiguous redirect root@bla:~/blabla#/add2.sh ++fmt= 定义服务{ 主机名%s 服务描述所有可用空间 check_命令check_nrpe!检查所有磁盘!3%%1%% 使用用户磁盘 }' ++对于“/root/user/test/*.cfg”中的文件 ++cfg='*.cfg' ++printf' 定义服务{ 主机名%s 服务描述所有可用空间 check_命令check_nrpe!检查所有磁盘!3%%1%% 使用用户磁盘 }' '*' ./add2.sh:第14行:/root/blabla/test/servers/$cfg:不明确重定向Bash 带有输出文本变量的嵌套for循环,bash,for-loop,nested-loops,Bash,For Loop,Nested Loops,我需要修改简单的bash脚本来遍历一个文件,并使用file变量的名称在每个文件的末尾添加一些文本。这里有一个Nagios.cfg文件的示例……到目前为止,我得到了如下内容: #!/bin/bash list=$(ls /root/user/test/ | sed "s/\.cfg//") for servery in `/root/user/test/*.cfg`; do for $list; do echo ` define ser
再抽象一点 更新- 根据上述注释检查文件是否存在
#!/bin/bash
fmt='
define service {
host_name %s
service_description All_fs_free_space
check_command check_nrpe!check_all_disks!3%% 1%%
use user-disk
}'
for file in /root/user/test/*.cfg # assuming there are *.cfg files here
do if [[ -e "/root/blabla/test/servers/$cfg" ]]
then cfg=${file##*/} # stripping the path
printf "$fmt\n" "${cfg%.cfg}" >> /etc/nagios3/conf.d/servers/test/$cfg
else echo "File not found: /root/blabla/test/servers/$cfg" >&2
fi
done
对你的意图做出一些假设。在使用通配符之前,我会先备份所有内容,然后进行编辑以仅匹配一个测试文件…这是否回答了您的问题?运行脚本。您有几个简单的语法错误。非常确定您不希望在
/root/user/test/*.cfg
或您的输出中出现反勾号。++对于'/root/user/test/*.cfg'
中的文件和++cfg='*.cfg'
意味着在/root/user/test/
中没有以cfg
结尾的文件名可以循环。如果希望它跳过循环而不出现错误(或任何其他有用的输出),请设置shopt-s nullglob
。否则,在处理之前,显式测试是否存在/root/blabla/test/servers/$cfg
,如果不存在则失败。见下文。是的,但这可能只完成部分工作。在“%s”(在我的示例中为$list)处,我需要一个变量,该变量包含配置文件的名称(服务器的主机名),没有cfg后缀。SKcript通过一次迭代将$fmt的内容放在文件的末尾,并更改变量$list,如将要修改的文件名。%s
是printf
格式字符串中的字符串替换指示符,这就是为什么有另一个参数-cfg=${file}
去掉前导路径信息,因此“${cfg%.cfg}”
只是配置文件的名称,没有cfg后缀。你试过了吗?哦,好吧,对不起,我不知道,bash magic。但不管怎样,我得到了“第13行:/etc/nagios3/conf.d/servers/test/$cfg:dimensional redirect”,在顶部放置了一个set-x
,以查看实际解析的内容。奇怪的是,$cfg
没有首先展开。使用用户磁盘}“*”
这是设置-x发生错误之前的最后两行代码