【问题标题】:Making a command loop in shell with a script使用脚本在 shell 中创建命令循环
【发布时间】:2010-07-10 22:35:12
【问题描述】:

如何在不将循环写入脚本或其他应用程序的情况下在 Unix shell 中循环命令/程序。

例如,我编写了一个输出光传感器值的脚本,但我现在仍在测试它,所以我希望它通过重复运行可执行文件来循环运行它。

也许我还想在循环中运行“ls”或“df”。我知道我可以用几行 bash 代码轻松地做到这一点,但是能够在终端中为任何给定的命令集键入命令对我来说同样有用。

【问题讨论】:

    标签: bash shell loops


    【解决方案1】:

    您可以编写与在 shell 脚本中编写的完全相同的循环,只需将它写在一行中,用分号代替回车,就像 in

    for NAME [in LIST ]; do COMMANDS; done
    

    此时,您可以编写一个名为 repeat 的 shell 脚本,给定一个命令,将其运行 N 次,只需将 COMMANDS 更改为 $1 即可。

    【讨论】:

    • 谢谢,我选择了无限的 while: while [ 1 ];做 sudo ./sensorTest.py;完成
    【解决方案2】:

    我推荐使用“watch”,它只是做你想做的事,它会在每次执行命令之前清理终端,所以很容易监控变化。

    您可能已经拥有它,只需尝试watch lswatch ./my_script.sh。您甚至可以使用 -n 选项控制每次执行之间的等待时间(以秒为单位),还可以使用 -d 突出显示连续运行的输出差异。

    试试:

    每秒运行 ls:

    watch -n 1 ls
    

    每 3 秒运行一次 my_script.sh,并突出显示差异:

    watch -n 3 -d ./my_script.sh
    

    观看程序手册页: http://linux.die.net/man/1/watch

    【讨论】:

      【解决方案3】:

      这并不能完全回答你的问题,但我觉得它是相关的。 shell 循环的一大优点是某些命令会返回项目列表。当然这很明显,但是您可以使用 for 循环执行的操作是在该项目列表上执行命令。

      for $file in `find . -name *.wma`; do cp $file  ./new/location/ done;
      

      你可以发挥创造力,做一些非常强大的事情。

      【讨论】:

      • 这是一种强大的技术,但如果文件名中有空格,它就会失败。此外,{} 在您的示例中毫无意义。你需要一个变量:for item in $list; do echo "$item"; done
      • find 是一个不好的例子,因为它的 -exec 参数与 for 循环做同样的事情,但以一种空间友好的方式。不过,这是一项很棒的技术,我经常使用它。
      【解决方案4】:

      除了接受参数之外,您可以在脚本中执行的任何操作都可以在命令行中完成。早些时候,我直接在 bash 中输入了这个,以观察在传输文件时目录是否填满:

      while sleep 5s
      do
        ls photos
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-03
        • 2015-01-18
        • 2012-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多