只有在命令没有失败的情况下,我才想将我的变量分配给a
命令结果的第一个词。func <some_arg>
如果它失败了,我需要记录下来。
到目前为止我所做的是:
func() {
if [[ $1 -eq 1 ]]
then
echo 'hello world'
return 0
fi
echo 'Something wrong has happened!' >> path/to/dev.log
return 2
}
a=$(func 1)
r=$?
if [[ $r -eq 0 ]]
then
a=$(awk '{ print $1 }' <<<"$a")
fi
这当然有效,但我不喜欢a
两次分配我的变量。
我试过这个:
a=$(func 2 | awk '{ print $1 }') || echo 'Something wrong has happened!' >> path/to/dev.log
但它不记录任何内容
有没有更好的办法?
您可以使用
set -o pipefail
从管道的早期部分获取错误:但实际上,我不明白为什么分配两次会成为一个问题。本质上,如果命令成功,你只是修改你得到的值,或者如果失败则忽略它。
此外,您可以稍微压缩一下该逻辑:
印刷
shell 有几种本机方法来解析字符串的第一个单词:
按后缀修剪 -
${a%% *}
分配给位置参数 -
set -- ${a}
- 结果将在$1
. 您可以使用set -- $(func 1)
.划分为数组元素(
bash
仅)-a=( $(func 1) )
- 结果将在${a[0]}
.您的代码的一个问题是,
a
即使函数func
返回非零结果,它也会破坏。反而:
运行这将产生
如您所见,在第二种情况下,
a
保留其值。