Невозможно присвоить результат функции переменной

Далее следуют

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

В чем проблема ??

0
задан 12 January 2018 в 18:13

2 ответа

bash пытается выполнить команду OS и терпит неудачу, потому что

$(OS)

- это Подстановка команды , тогда как

${OS} # or
$OS

- Параметр Расширение .

Правильный способ печати содержимого переменной OS - echo $OS.

Я полагаю, что вы, однако, хотите запустить вашу функцию, которая присваивает значение вашей переменной OS, а затем распечатать ее содержимое, если функция еще не выполнила:

getos
echo $OS
2
ответ дан 12 January 2018 в 18:13

Основная проблема заключается в том, что OS=${getos} ожидает, что getos будет переменной , а не функцией (это расширение параметров, а не подстановка команд) - они фактически являются различными пространствами имен:

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

$

(т.е. переменная foo пуста); тогда как

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

Если вы хотите, чтобы OS был синонимом для getos, вы можете использовать псевдоним :

alias OS='getos'

(хотя, если вы При использовании этого в сценарии учтите, что расширение псевдонимов включено по умолчанию только в интерактивных оболочках).

TL; DR: скобки и скобки НЕ взаимозаменяемы

3
ответ дан 12 January 2018 в 18:13
  • 1
    @nomadicME Видят serverfault.com/q/49765/51929 для длинного описания. Короче говоря, необходимо использовать 74.125.0.0/16. Для большего количества IP-адресов, которые может использовать Gmail, используйте эти dig _spf.google.com TXT команда. – Lekensteyn 4 June 2012 в 21:55
  • 2
    @nomadicME Видят serverfault.com/q/49765/51929 для длинного описания. Короче говоря, необходимо использовать 74.125.0.0/16. Для большего количества IP-адресов, которые может использовать Gmail, используйте эти dig _spf.google.com TXT команда. – Lekensteyn 4 June 2012 в 21:55
  • 3
    @nomadicME Видят serverfault.com/q/49765/51929 для длинного описания. Короче говоря, необходимо использовать 74.125.0.0/16. Для большего количества IP-адресов, которые может использовать Gmail, используйте эти dig _spf.google.com TXT команда. – Lekensteyn 4 June 2012 в 21:55
  • 4
    @nomadicME Видят serverfault.com/q/49765/51929 для длинного описания. Короче говоря, необходимо использовать 74.125.0.0/16. Для большего количества IP-адресов, которые может использовать Gmail, используйте эти dig _spf.google.com TXT команда. – Lekensteyn 4 June 2012 в 21:55
  • 5
    @nomadicME Видят serverfault.com/q/49765/51929 для длинного описания. Короче говоря, необходимо использовать 74.125.0.0/16. Для большего количества IP-адресов, которые может использовать Gmail, используйте эти dig _spf.google.com TXT команда. – Lekensteyn 4 June 2012 в 21:55
  • 6
    @nomadicME Видят serverfault.com/q/49765/51929 для длинного описания. Короче говоря, необходимо использовать 74.125.0.0/16. Для большего количества IP-адресов, которые может использовать Gmail, используйте эти dig _spf.google.com TXT команда. – Lekensteyn 4 June 2012 в 21:55

Другие вопросы по тегам:

Похожие вопросы: