【问题标题】:How to write while loop so that the following task can be accomplished using bash?如何编写while循环以便使用bash完成以下任务?
【发布时间】:2021-11-04 02:37:41
【问题描述】:

我正在编写一个脚本,如果文件夹发生更改,假设文件从文件夹中删除,那么脚本应该执行,并且该脚本正在检查多个文件夹。以下是我为执行相同操作而编写的代码,但它并未针对所有语句执行,只有第一条语句有效。 有人可以看看它并指导如何完成这项任务吗?任何建议都非常受欢迎。谢谢。

folder2=/script/automation/folder2
folder1=/script/automation/folder1
folder3=/script/automation/folder3


# While statement
/usr/local/bin/inotifywait -mqr -e delete $folder2 | while read line
do
./script/automation/run2/script2.sh >> /output.txt
done

/usr/local/bin/inotifywait -mqr -e delete $folder1 | while read line
do
./script/automation/run1/script1.sh >> /output.txt
done

/usr/local/bin/inotifywait -mqr -e delete $folder3 | while read line
do
./script/automation/run3/script3.sh >> /output.txt
done

【问题讨论】:

  • done 之后添加&,然后在末尾添加wait

标签: bash shell while-loop script


【解决方案1】:

第一个while read 永远不会结束。这就是为什么第二个和第三个循环永远不会运行的原因。您必须并行运行循环,这意味着您必须使用 & 将它们放在后台,并且您必须等待后台任务。

如果你重复三遍,最好为这项工作编写一个函数。 Don't repeat yourself.

exec > output.txt 命令将所有输出重定向到一个文件。所以你不需要重定向每一个命令。

试试这样的。

#! /bin/bash

base=script/automation

run ()
{
  local folder=$1
  local script=$2

  /usr/local/bin/inotifywait -mqr -e delete "$base/$folder" |
    while read line; do
      "$base/$script"
    done
}

exec > output.txt

for n in 1 2 3; do
  run "folder$n" "run$n/script$n.sh" &
done

wait

【讨论】:

  • 尝试了这两个选项,它按预期工作。非常感谢你做的这些。只有我所做的更改是在完成后提供的函数运行“&”值。因为它试图执行脚本三次。
猜你喜欢
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 2013-07-09
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多