标签: control-flow

并行循环遍历两个文件的行

我正在制作的脚本的目的是比较两个系列的文件。文件名本身存储在两个单独的文件中,每行一个路径。我的想法是有两个while read循环,每个文件名列表一个循环,但是如何将两个循环混合在一起?

while read compareFile <&3; do     
 if [[ ! $server =~ [^[:space:]] ]] ; then  #empty line exception
    continue
 fi   
    echo "Comparing file - $compareFile"
 if diff "$compareFile" _(other file from loop?_) >/dev/null ; then
     echo Same
 else
      echo Different
 fi 
done 3</infanass/dev/admin/filestoCompare.txt
Run Code Online (Sandbox Code Playgroud)

我需要能够通过两个 while 读取循环同时比较来自两个不同列表的文件......这甚至可能吗?

bash shell-script control-flow

23
推荐指数
2
解决办法
3万
查看次数

do...while 或 do...until 在 POSIX shell 脚本中

有一个众所周知的while condition; do ...; done循环,但是否有一种do... while样式循环可以保证至少执行一次块?

shell control-flow

22
推荐指数
2
解决办法
6万
查看次数

在“if”中将任务发送到后台

为什么是这样?

if true; then sleep 3 &; fi
bash: syntax error near unexpected token `;'
Run Code Online (Sandbox Code Playgroud)

我想跑

sleep 3
Run Code Online (Sandbox Code Playgroud)

在后台,以便命令 ["sleep 3" 只是一个示例] 将以“并行”样式运行,因此它完成得更快。但我得到这个:

bash: syntax error near unexpected token `;'
Run Code Online (Sandbox Code Playgroud)

错误信息。为什么?为什么我不能向后台发送任务?

shell bash control-flow

12
推荐指数
2
解决办法
1870
查看次数

检查多个目录的存在

我想检查工作目录中是否存在多个目录,例如dir1dir2dir3

我有以下

if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
    echo True
else
    echo False
fi
Run Code Online (Sandbox Code Playgroud)

但我怀疑有一种更优雅的方式来做到这一点。不要假设目录名称中存在模式。

目标是检查几个目录的存在和其他目录的不存在。

我正在使用 Bash,但首选可移植代码。

shell directory shell-script files control-flow

10
推荐指数
4
解决办法
7424
查看次数

运行 2 个 while 循环的最有效方法

目前我使用两个不同的while循环来启动我的窗口管理器dwm和将系统信息打印到它的状态栏。

我目前的解决方案是在同一个脚本中连续运行它们,如下所示:

while true; do
        $HOME/Scripts/dwm-status
        sleep 2s
    done &
while true; do
    dwm >/dev/null
done
Run Code Online (Sandbox Code Playgroud)

我还看到它作为嵌套while循环运行,如下所示:

while true; do
        while true; do
            $HOME/Scripts/dwm-status
            sleep 2s
        done &
        dwm >/dev/null
    done
Run Code Online (Sandbox Code Playgroud)

第二个似乎导致 CPU 峰值。在效率方面(最少占用资源等),运行这两个循环的最佳方法是什么,为什么?

bash control-flow

9
推荐指数
1
解决办法
4137
查看次数

为什么 'for anytext; 循环四次?

这是错误还是功能?
对于未引用的字母数字,似乎会发生这种情况。

运行 GNU bash,版本 4.1.5

for alpha01234; do echo $((++i)); done
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

shell bash control-flow

9
推荐指数
2
解决办法
403
查看次数

逐行读取文件时请求用户输入

对于类,我需要编写一个 Bash 脚本来获取输出ispell,当我尝试在 while 循环中请求用户输入时,它只会将文件的下一行保存为用户输入。

我怎样才能在 while 循环中请求用户输入?

#!/bin/bash
#Returns the misspelled words
#ispell -l < file

#define vars
ISPELL_OUTPUT_FILE="output.tmp";
INPUT_FILE=$1


ispell -l < $INPUT_FILE > $ISPELL_OUTPUT_FILE;

#echo a new line for give space between command
#and the output generated
echo "";

while read line;
do
   echo "'$line' is misspelled. Press "Enter" to keep";
   read -p "this spelling, or type a correction here: " USER_INPUT;

   if [ $USER_INPUT != "" ]
   then
      echo "INPUT: $USER_INPUT";
   fi


   echo ""; …
Run Code Online (Sandbox Code Playgroud)

bash shell-script control-flow user-input

9
推荐指数
1
解决办法
4577
查看次数

[ vs [[ : 在 bash 脚本中使用哪一个?

zsh 手册页在test(aka [)部分明确建议不要使用它,并敦促读者[[尽可能使用它。

相关章节中指出:

该命令尝试在指定的位置实现 POSIX 及其扩展。不幸的是,语法中存在内在的歧义;特别是测试运算符和类似它们的字符串之间没有区别。该标准试图解决这些问题的少量参数(最多四个);不能依赖五个或更多参数的兼容性。敦促用户尽可能使用[[没有这些歧义的“ ”测试语法。

我想我遇到过类似的 bash 建议,但是当我浏览 bash 手册页时,我找不到任何关于使用哪种表单([[[)的“官方”建议。(也许我错过了?)

除了向后兼容“旧外壳”之外,还有什么理由可以[在 bash 脚本中使用吗?或者换种方式,确实庆典保持[连同[[其原因其他比向后兼容?

bash zsh shell-script control-flow test

8
推荐指数
2
解决办法
1920
查看次数

一个 while 循环和一个 here-document - 什么时候发生?

我有这个 while 循环和 here-document 组合,我在 Bash 4.3.48(1) 中运行,我根本不明白它的逻辑。

while read file; do source ~/unwe/"$file"
done <<-EOF
    x.sh
    y.sh
EOF
Run Code Online (Sandbox Code Playgroud)

我的问题由以下部分组成:

  1. read这里做什么(我总是read用来声明一个变量并以交互方式分配它的值,但我错过了它应该在这里做什么)。

  2. 是什么意思while readwhile进来的概念从哪里来?

  3. 如果 here-document 本身出现循环之后,它甚至如何受到循环的影响?我的意思是,它出现在 之后done,而不是在循环内部,那么这两个结构之间的实际关联是什么?

  4. 为什么这会失败?

    while read file; do source ~/unwe/"$file" done <<-EOF
        x.sh
        y.sh
    EOF
    
    Run Code Online (Sandbox Code Playgroud)

    我的意思是,donedone...那么为什么done <<-EOF与循环在同一行上很重要?如果我没记错的话,我确实遇到过这样一种情况,其中for循环是单行的并且仍然有效。

text-processing control-flow here-document variable read

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

在 Bash 脚本中, continue 命令如何与嵌入式循环一起工作?

我正在busybox 会话中编写一个bash 脚本。

该脚本必须以守护程序的形式按顺序多次启动外部可执行文件,然后监视输出。

while read LINE; do
  VARIABLEPARAMETER=`echo "$LINE" | sed -e 's/appropriateregex(s)//'`
  externalprog --daemonize -acton $VARIABLEPARAMETER -o /tmp/outputfile.txt
  until [ "TRIGGERED" = "1" ]; do
    WATCHOUTPUT=`tail -n30 /tmp/outputfile.txt`
    TRIGGERED=`echo "$WATCHOUTPUT" | grep "keyword(s)"` 
    if [ -z "$TRIGGERED" ]; then
      PROGID=`pgrep externalprog`
      kill -2 "$PROGID"
      continue
    fi
  done
done < /tmp/sourcedata.txt
Run Code Online (Sandbox Code Playgroud)

我的问题是 continue 命令将针对两个循环中的哪一个执行?

最初的 while 读取行,还是随后的,直到触发?

请不要专注于我将它们放在一起作为尝试解释这个问题的示例的实际代码,实际代码要详细得多。

shell bash control-flow

7
推荐指数
1
解决办法
1万
查看次数