无法将函数结果赋给变量

无法将函数结果赋给变量

遵从

https://stackoverflow.com/questions/1809899/how-can-i-assign-the-output-of-a-function-to-a-variable-using-bash如何将命令的输出分配给变量?

我写

function getos(){
    # http://stackoverflow.com/a/27776822/1637673
    case "$(uname -s)" in
       Darwin)
         OS='mac'
         ;;
       Linux)
         OS='linux'
         ;;
       CYGWIN*|MINGW32*|MSYS*)
         OS='win'
         ;;
       # Add here more strings to compare
       # See correspondence table at the bottom of this answer
       *)
         OS='other'
         ;;
    esac
    echo $OS
}


echo $(getos)

OS=${getos}
echo ${OS} # show nothing
echo $OS   # show nothing
echo $(OS) # line 36

bash common.sh得到了

linux


common.sh: line 36: OS: command not found

有什么问题 ??

答案1

根本问题是,OS=${getos}预计getos多变的,而不是函数(它是参数扩展而不是命令替换) - 它们实际上是不同的命名空间:

$ function foo() { echo foo; }
$ foo
foo
$ echo ${foo}

$

(IE多变的 foo为空);而

$ foo=bar
$
$ foo
foo
$ echo ${foo}
bar

如果你想OS成为的同义词getos,你可以使用别名

alias OS='getos'

(尽管如果您在脚本中使用它,请注意别名扩展仅在交互式 shell 中默认启用)。

TL;DR:圆括号和大括号不可互换

答案2

bash尝试运行命令OS并失败,因为

$(OS)

命令替换然而

${OS} # or
$OS

参数扩展

打印变量内容的正确方法OSecho $OS

我想你还是想跑步您的函数,为您的变量分配一个值OS,然后打印其内容(如果函数尚未完成):

getos
echo $OS

相关内容