【问题标题】:Can't access variables inside parenthesis in bash无法访问bash括号内的变量
【发布时间】:2020-06-30 23:37:12
【问题描述】:

在 bash 中,如果我运行

(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

【问题讨论】:

  • 在这种情况下使用括号有什么意义?我认为不需要额外的子外壳。另外,我认为查询tr的退出代码没有意义。 AFIK,tr 如果从标准输入读取并且没有使用无效选项调用,则始终返回退出代码 0。在您的情况下,我认为不会采用 else 分支。
  • @user1934428 这只是一个简单的例子。实际上,我的 if 语句比这更令人生畏和复杂。

标签: bash macos variables if-statement


【解决方案1】:

括号中的命令,例如() 在子 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

【讨论】:

  • 感谢嫌疑人,到目前为止,这似乎工作正常。你能解释一下if [ "$bar" ] 正在检查什么吗?现在[[ .... ]] 不是首选吗?
  • 我已更改测试以匹配消息。测试是tr 命令无错误退出。在那种情况下 $?是 0。关于 [[ ]] 和 [] 辩论,在这种情况下都是。我使用很多旧的 shell,所以有时我默认使用旧的 []。
  • 只是,正如我上面提到的,this tr 永远不会失败,除非一些恶毒的灵魂将它从 /usr/bin 中删除,所以 if 是 IMO没用。
猜你喜欢
  • 2014-01-03
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
相关资源
最近更新 更多