无法在bash的括号内访问变量

4

In bash, if I run

(foo=14)

然后尝试在我的bash脚本中稍后引用该变量:

最初的回答:

echo "${foo}"

我不明白。我该如何让bash以我需要的方式存储这个变量?
具体来说,我在if语句中使用它并检查退出代码,类似于以下内容:
if (bar="$(foo=14;echo "${foo}"|tr '1' 'a' 2>&1)")
then
    echo "Setting "'$bar'" was a success. It is ${bar}"
else
    echo "Setting "'$bar'" failed with a nonzero exit code."
fi

在这种情况下使用括号有什么意义?我看不出需要额外的子shell。此外,我认为查询tr的退出代码没有任何意义。据我所知,如果从stdin读取并且未使用无效选项调用,则tr始终返回退出代码0。在您的情况下,我看不到else分支会被执行的可能性。 - user1934428
@user1934428 那只是一个简单的例子。实际上,我的 if 语句比那复杂得多。 - leetbacoon
1个回答

6

圆括号包含的命令,例如(),将在子shell中执行。子shell中的任何赋值都不会存在于该子shell之外。

foo=14
bar=$(echo $foo | tr '1' 'a' )
if [[ $? -eq 0 ]]
then
    echo "Setting "'$bar'" was a success. It is ${bar}"
else
    echo "Setting "'$bar'" failed with a nonzero exit code."
fi

谢谢suspectus,目前看起来这个代码还可以。你能解释一下 if [ "$bar" ] 检查的是什么吗?现在不是更推荐使用 [[ .... ]] 吗? - leetbacoon
1
我已经更改了测试以匹配消息。测试是tr命令无错误退出。在这种情况下,$?为0。关于[[ ]]和[]的辩论,两者都可以。我使用很多旧的shell,所以有时会默认使用旧的[]。 - suspectus
就像我上面提到的那样,除非有恶意的人从 /usr/bin 中删除了这个 tr,否则它永远不会失败,所以在我看来,这个 if 是无用的。 - user1934428

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接