【问题标题】:How can I delete a particular if statement in shell script file and do the same for all files of all folders inside a single folder如何删除 shell 脚本文件中的特定 if 语句并对单个文件夹中所有文件夹的所有文件执行相同操作
【发布时间】:2015-07-01 18:25:31
【问题描述】:

如何删除 shell 脚本文件(比如 file.sh)中的特定 if 语句,并使用 for 循环对单个文件夹内所有文件夹的所有文件(file.sh)执行相同操作找到文件?

详细解释:

我有一个文件夹 A。它里面有各种文件夹,假设 B、C、D、E... 等等。 B、C、D、E...等的所有/部分文件夹有两个文件,file1.sh 和file2.sh。 这两个文件,file1.sh 和 file2.sh 有一个 if 语句。

if [ $usertype != "adm" ]
then
    echo "deploy can only be run with dtp?adm account."
    exit 1
fi

我想编写一个脚本,它将文件夹 A 作为参数,检查其每个子文件夹 B、C、D、E 等中的文件 file1.sh 和 file2.sh。如果找到这些文件, 它将检查上面的 if 语句,如果它存在,它应该将这个完整的 if 语句从if 删除到fi,保存文件并退出。

【问题讨论】:

  • 请注意,if 语句不是循环。假设一个文件夹只有file1.sh 而没有file2.sh 但它包含if 语句;文件应该被编辑吗?假设一个文件夹有file3.sh 包含if 语句;文件应该被编辑吗?我注意到if 语句在变量周围没有引号,最好有它们,并且在不需要它们的文字周围有引号(但我可能会将它们放/保留在那里以保持对称/明晰)。不过,既然他们要去,那就不是什么大问题了。您需要查看sed,并检查-i.bak 选项。
  • Jonathan Leffler,您的疑问是 --> 假设一个文件夹只有 file1.sh 而没有 file2.sh 但它包含 if 语句;文件应该被编辑吗?假设一个文件夹有包含 if 语句的 file3.sh;文件应该被编辑吗? 这个问题的答案是肯定的,但是if语句应该和上面的条件完全一样,我的意思是条件$usertype != "adm"

标签: bash shell unix


【解决方案1】:

我现在使用 SED 命令编写了一个简单的 shell 脚本。感谢 Thomas 的建议。

 for file in `find $1 -type f -name "deploy*.sh" -print 2>/dev/null`
do
echo "File checked : $file"
sed 's/\$usertype/adm/g' $file > $file.new
mv $file.new $file
done

它按预期对我有用。请注意,每个包含 $usertype 的 deploy*.sh 文件中只有一个 if 条件。

所以如果脚本执行后条件变成这样,

if [ adm != "adm" ] 
    then
    ...
fi

因为哪个控件永远不会进入 if 循环。谢谢大家的帮助

【讨论】:

【解决方案2】:

假设给定的文件夹是当前目录.,那么你也许可以使用:

find . -type f -name '*.sh' -exec \
    sed -i.bak '/if [ $usertype != "adm" ]/,/fi/d' {} +

这假定测试在任何其他情况下都不会出现,并简单地删除if 和下一个fi 之间的行。备份文件以防万一出现问题。它在给定目录下查找所有.sh 文件。最后的+ 适用于find 的现代版本,实际上更像xargs。如果你的find 不支持+,有办法解决它;最简单的方法是使用\;';' 代替+,但这意味着sed 将在每个文件中执行一次,而不是对多个文件执行一次。

如果需要更多检查,因此thenechoexit 需要匹配,那么我可能会切换到 Perl 并使用“段落”读取模式以多行方式读取文件块并仅在与整个文本块匹配时才删除块。

【讨论】:

    【解决方案3】:

    我不能评论,所以我尝试这样:也许删除 if 语句不是必需的,使用 sed/awk 将 if 语句更改为始终为 false 的条件,例如:

    if [ "a" == "b" ] # if [ $usertype != "adm" ]
    then
    ...
    fi
    

    使用 sed/awk 替换整行的示例:

    bash: replace an entire line in a text file

    change a line with awk

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 2017-10-27
      • 1970-01-01
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多