Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在bash中有条件地对命令数组的每个迭代/元素执行某些操作_Arrays_Bash - Fatal编程技术网

Arrays 在bash中有条件地对命令数组的每个迭代/元素执行某些操作

Arrays 在bash中有条件地对命令数组的每个迭代/元素执行某些操作,arrays,bash,Arrays,Bash,因此,我有一个充满命令的数组,我想运行每个元素,并将命令输出到屏幕上,同时检查每个命令中是否有错误,并回显“command failed”。我找不到一种以编程方式实现这一点的方法,我基本上希望运行命令时,不会让命令的错误输出充斥屏幕 例如: array=( "cat something" "grep something" "rm something" "read -r -p 'something' something" ) length=${#array[@]} for (( i=1; i<

因此,我有一个充满命令的数组,我想运行每个元素,并将命令输出到屏幕上,同时检查每个命令中是否有错误,并回显“command failed”。我找不到一种以编程方式实现这一点的方法,我基本上希望运行命令时,不会让命令的错误输出充斥屏幕

例如:

array=(
"cat something"
"grep something"
"rm something"
"read -r -p 'something' something"
)
length=${#array[@]}
for (( i=1; i<${length}+1; i++ ));
do
    if echo ${array[$i-1]} | sh 2>/dev/null; then
        echo "command succeded"
    else
        echo "command failed"
    fi
done
数组=(
“猫什么的”
“grep某物”
“什么东西”
“读-r-p‘某物’某物”
)
长度=${#数组[@]}
对于((i=1;i/dev/null;然后
echo“命令成功”
其他的
echo“命令失败”
fi
完成

我想这就是你想要的:

command_list="command1;command2"
       #I tried it with command_list="ls;ls <sub-directory>"
while IFS=';' read -ra command_array; do
      for i in "${command_array[@]}"; do
          # process "$i"
           if ( $i &>/dev/null )
           then
                echo "Success"
           else
                echo "Failed"
           fi
      done
 done <<< $command_list

如果我添加了一个
fi
来修复语法错误,那么我可以使用
bash
。除了
I=1
跳过数组的第一个元素之外,您可以简单地使用
length
而不是
${length}+1
(数组末尾的一个)来进行
循环定义(
(…)
的行为就像算术
((…)
)一样,允许您简单地使用
${array[i]}
而不是
${array[$i-1]}
,后者在技术上需要是
${array[$((i-1))}
${array[$i-1]}缺少双引号
可能会导致对某些命令进行奇怪的解析。您可以使用
eval
而不是管道传输到
sh
。但是如果其中一个命令以“read”之类的方式进行输入,该怎么办?我还需要查看命令的输出。@Jake Leroy如果您想查看命令的输出,请从
if($I&>/dev/null)中删除
/null
。如果我理解正确,则如果命令失败,您希望打印“命令失败”,否则请打印其输出以及“成功”。您要查找的是命令的
exit_status
,它在bash中是
$?
。但是在执行该命令之前,您不会知道该状态。您可以在for循环中执行此操作,作为
$1&>/dev/null exit_status=$?如果($exit_status==0)),则$1 else会回显“失败”fi
如果您使用的是install之类的命令,则此操作可能会失败。它正在输出此错误:意外标记“$1”附近出现语法错误,很抱歉……这应该是
$I
。我的错误:(.是的,请注意,这可能并不总是有效。我可以给您提供的最佳示例是当您使用
rm
命令时。如前所述,在执行该命令之前,您无法知道该命令的状态。我将根据此讨论对答案进行更改。
while IFS=';' read -ra command_array; do
   for i in "${command_array[@]}"; do
          # process "$i"
          $i &>/dev/null 
          exit_status=$?
          if (( exit_status == 0 ))
          then
          $i
          echo "Success...."
          else
          echo "Failed"
          fi
      done
 done <<< $command_list