Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 带有输出文本变量的嵌套for循环_Bash_For Loop_Nested Loops - Fatal编程技术网

Bash 带有输出文本变量的嵌套for循环

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

我需要修改简单的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:不明确重定向
再抽象一点

更新- 根据上述注释检查文件是否存在

#!/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发生错误之前的最后两行代码