我已经编写了一个脚本来 ssh 远程主机、执行命令、将输出保存到文件并检查输出。但当(( success++ ))
迭代 array 中的第一项时,它总是默默地退出workers
。如果我替换(( success++ ))
为echo "process $worker"
,它将正常工作并打印所有主机。我不知道出了什么问题。
#!/bin/bash
set -x
set -e
workers=('host-1' 'host-2' 'host-3')
output_dir=$(mktemp -d)
for worker in ${workers[@]}; do
ssh $worker '
echo abc
echo OK
' > "$output_dir/$worker" &
done
echo "waiting..."
sleep 3
wait
success=0
regexp='OK$'
for worker in ${workers[@]}; do
output=`cat "$output_dir/$worker"`
if [[ "$output" =~ $regexp ]]; then
(( success++ ))
fi
done
echo "Total ${#workers[@]}; success: $success; failure: $((${#workers[@]} - success))"
答案1
答案2
这是设定的结果-e
。任何退出代码为 1(非零)的命令都将触发退出。
这个脚本运行良好:
#!/bin/bash
(( success++))
echo "Still going 1 $success"
这不
#!/bin/bash
set -e
(( success++))
echo "Still going 1 $success"
解决方案
最简单的就是把set -e
线去掉。
如果这不是一个选项,请使用此:
(( ++success ))
其他替代方案:
#!/bin/bash
set -e
success=0
success=$(( success+1 ))
echo "still going 1 $success"
success=0
(( success=success+1 ))
echo "still going 2 $success"
success=0
(( success+=1 ))
echo "still going 3 $success"
success=0
(( ++success ))
echo "still going 4 $success"
success=0
(( success++ ))
echo "still going 5 $success"
只有选项号 5 的退出代码为 1。
其他(对于任何变量值的更复杂的解决方案a
)。
第一个使用的是(POSIX):
内置冒号 ( )使其兼容 POSIX。
: $(( a+=1 )) ; echo "6 $a $?" ## Valid Posix
(( a++ )) || true ; echo "7 $a $?"
(( a++ )) || : ; echo "8 $a $?"
(( a++ , 1 )) ; echo "9 $a $?"
(( a++ | 1 )) ; echo "10 $a $?"