相关疑难解决方法(0)

Bash虽然读取循环早期破坏

我一直在用这个撞击墙壁一段时间.

我想要SSH到一组机器并检查它们是否可用(接受连接而不是被使用).我创建了一个小脚本tssh,它就是这样做的:

#!/bin/bash

host=$1
timeout=${2:-1}

ssh -qo "ConnectTimeout $timeout" $host "[ \`who | cut -f1 | wc -l \` -eq 0 ] && exit 0 || exit 1"
Run Code Online (Sandbox Code Playgroud)

此脚本正常工作.如果出现连接问题则返回255,如果机器正忙则返回1,如果一切正常则返回0.如果有人知道更好的方法,请告诉我.

接下来我尝试使用while读取循环在我的机器上调用tssh,这就是出错的地方.一旦tssh返回0,循环就会退出,并且永远不会完成整个集合.

while read nu ; do tssh "MYBOXES$nu" ; done < <(ruby -e '(0..20).each { |i| puts i }')
Run Code Online (Sandbox Code Playgroud)

起初我认为这是一个子壳问题,但显然不是.任何帮助,以及对风格/内容的评论,将不胜感激!我知道当我发现原因时我会踢自己...

bash shell

28
推荐指数
5
解决办法
3万
查看次数

读取循环时只执行一次Shell脚本

我正在编写一个shell脚本,通过Handbrake批量处理.mov文件,以节省高清空间.该脚本使用"find"搜索目录,然后在找到的每个.mov文件上运行Handbrake,将生成的文件的创建日期与源文件的日期匹配为"touch".

我最初使用for循环执行此操作:

for i in $(find "$*" -iname '*.mov') ; do
  ~/Unix/HandbrakeCLI --input "$i" --output "$i".mp4 --preset="Normal"
  touch -r "$i" "$i".mp4
done
Run Code Online (Sandbox Code Playgroud)

这有效,但如果输入文件的文件名中有空格,则会失败.所以我尝试了一个while循环:

find "$*" -iname '*.mov' | while read i ; do
  ~/Unix/HandbrakeCLI --input "$i" --output "$i".mp4 --preset="Normal"
  touch -r "$i" "$i".mp4
done
Run Code Online (Sandbox Code Playgroud)

这个循环的问题是它适用于目录中的第一个文件,然后退出循环.请注意,如果我在while循环体中替换"echo $ i",它会打印目录中的所有.mov文件,因此循环结构正确.

我相信我对这个stackoverflow线程的问题有部分答案.但该解决方案特定于ssh,并不能解决一般问题.似乎与子进程使用的stdin有关,但我不完全理解它是如何工作的.

有什么建议?

我在OSX 10.6上

shell loops for-loop while-loop

8
推荐指数
1
解决办法
7951
查看次数

标签 统计

shell ×2

bash ×1

for-loop ×1

loops ×1

while-loop ×1