为什么在第一次迭代后此循环中断?

布兰登·达勒姆(Brandon Durham)

尝试遍历目录中的所有文件,检查它们是否存在字符串,如果不存在则添加它。这就是我所拥有的:

#!/bin/bash
FILES=*
for f in $FILES
do
    echo "Processing $f file..."
    if grep -Fxq '<?xml version="1.0" encoding="UTF-8"?>' $f
    then
        continue
    else
        echo '<?xml version="1.0" encoding="UTF-8"?>' | cat - $f > temp && mv temp $f
    fi
done

…但是脚本在第一个循环后停止。有什么想法吗?

我是

一个更简单的解决方案是使用如下所示-ised工具的就地编辑选项

sed -i  '1{/^<?xml version="1.0" encoding="UTF-8"?>/!{
s/^/<?xml version="1.0" encoding="UTF-8"?>\n/}}' /path/to/files/*

我们在上面做什么

  • 该就地选项-ised使任何更改写入到文件的文件。
  • 通过1{}我们只处理文件的第一行
  • /^<?xml version="1.0" encoding="UTF-8"?>/!部分检查字符串是否在行的开头不存在(请注意末尾的!)。
  • 如果上述条件不成立,我们代替行的开头(^含)<?xml version="1.0" encoding="UTF-8"?>\n使用

         s/^/<?xml version="1.0" encoding="UTF-8"?>\n/
    
  • 其余的以正确的顺序关闭大括号:)

就是说,在您的原始脚本中,我看到了类似的变量FILES不建议将大写变量用作用户变量,因为它们被保留为环境变量并可能导致冲突。因此请files改用。

再次做

file=*

如果您有包含空格甚至是换行符的非标准文件,则具有[单词拆分]的含义,并且会产生不希望的结果。你能做的是

files=( * ) # This put the files in an array
for file in "${files[@]}" # Double quoting the array prevents word splitting
do
 # Do something with "$file" but why bother when you've a one-liner with sed? ;-)
done

注:对于sed手动访问[这里]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么此循环在第一次迭代时中断?

While 循环在第一次迭代后中断

第一次迭代后中断循环

为什么在第一次迭代后此刮擦停止?

为什么在第一次迭代后就停止了?

在第一次循环后,在while循环中运行`rg`会中断

在forEach循环中跳过第一次迭代

第一次循环代码后,“闹钟”中断

While 循环在第一次迭代后停止

For循环在第一次迭代后停止

循环在第一次迭代后停止吗?

For 循环在第一次迭代后结束

为什么Jenkinsfile中的每个循环在第一次迭代时停止

为什么左对齐在循环的第一次迭代中不起作用?

为什么Onclick函数仅适用于每个循环的第一次迭代

为什么我的循环只能在第一次迭代中正常工作?

为什么循环在第一次迭代中跳过输入?

“ For”循环第一次迭代

为什么While(rs.next())语句在第一次迭代后结束?

为什么getchar不能在第一次迭代后执行?

为什么第一次迭代后的指针指向随机值?

为什么在第一次循环后不执行while循环?

为什么单击此按钮后不更改文本,而仅在第一次更改

跳过循环中的第一步进行第一次迭代

为什么我的Java猜谜游戏在第一次循环后不起作用

在for循环的第一次迭代之后,为什么会出现此错误(TypeError:“ _ io.TextIOWrapper”对象不可下标)?

为什么一次迭代为真后,for循环中的if条件停止验证?

为什么这个内循环在外循环的第一次迭代中快4倍?

whilef循环中的scanf仅在第一次迭代时读取