Arrays 在bash中有条件地对命令数组的每个迭代/元素执行某些操作
因此,我有一个充满命令的数组,我想运行每个元素,并将命令输出到屏幕上,同时检查每个命令中是否有错误,并回显“command failed”。我找不到一种以编程方式实现这一点的方法,我基本上希望运行命令时,不会让命令的错误输出充斥屏幕 例如: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<
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