带有输出文本变量的嵌套 for 循环
Nested for loop with output text variable
我需要修改简单的 bash 脚本来遍历文件并在每个文件的末尾添加一些文本,其中包含文件变量的名称。有一个 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
不幸的是没有用,因为引号...?有没有更好的解决方案如何实现这一目标?谢谢。
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
再抽象一点。
更新-
按照上面的评论检查文件是否存在。
#!/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
对您的意图做出一些假设。
我会先备份所有内容,然后在使用通配符之前编辑以仅匹配一个文件进行测试...
我需要修改简单的 bash 脚本来遍历文件并在每个文件的末尾添加一些文本,其中包含文件变量的名称。有一个 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
不幸的是没有用,因为引号...?有没有更好的解决方案如何实现这一目标?谢谢。
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
再抽象一点。
更新-
按照上面的评论检查文件是否存在。
#!/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
对您的意图做出一些假设。
我会先备份所有内容,然后在使用通配符之前编辑以仅匹配一个文件进行测试...