Сохранение результата команды echo в сценарии оболочки? - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь сохранить результат команды echo как переменную, которая будет использоваться в сценарии оболочки. Debian 4.19.0-6-amd64

Команда работает в терминале: echo $HOSTNAME возвращает debian-base, правильное имя хоста.

Я пытаюсь запустить его в сценарии оболочки, например:

#!/usr/bin/bash

CURRENT_HOSTNAME=`echo $HOSTNAME`
echo $CURRENT_HOSTNAME

Я пробовал расширение:

CURRENT_HOSTNAME=$(echo $HOSTNAME)

И просто, чтобы охватить еще несколько баз, я попробовал что-то вроде:

CURRENT_HOSTNAME=$HOSTNAME
# or
CURRENT_HOSTNAME="$HOSTNAME"
# also, in case a problem with reserved names:
test=$HOSTNAME
test="$HOSTNAME"

Отлично работает вТерминал! Вывод выглядит следующим образом:

root@debian-base:/scripts# echo $HOSTNAME
debian-base
root@debian-base:/scripts# TEST_HOSTNAME=$HOSTNAME
root@debian-base:/scripts# echo $TEST_HOSTNAME
debian-base
root@debian-base:/scripts# TEST_TWO_HOSTNAME=$(echo $HOSTNAME)
root@debian-base:/scripts# echo $TEST_TWO_HOSTNAME
debian-base

Как только я запускаю скрипт (как указано выше):

root@debian-base:/scripts# sh test.sh

root@debian-base:/scripts#

Что я делаю не так?

1 Ответ

1 голос
/ 16 октября 2019

Вы используете bash в качестве терминала. В Bash установлена ​​переменная $HOSTNAME. Вы запускаете свой скрипт с sh. sh не имеет $HOSTNAME.

Параметры:

bash test.sh

Или запустить его как программу:

chmod +x test.sh
./test.sh

Но я думаю, что вам нужноизмените вашу первую строку на:

#!/bin/bash

Поскольку я не думаю, что bash устанавливается в /usr/bin в большинстве случаев. Но вам нужно попробовать. Чтобы выяснить, где установлен bash, используйте which bash

Другой вариант - использовать hostname бинарный файл:

CURRENT_HOSTNAME=$(hostname)
echo $CURRENT_HOSTNAME

, который работает как в bash, так и в sh.

Вы можете запустить sh, просто запустив sh. Вы увидите, что он имеет терминал, похожий на bash. Вы можете попробовать сделать echo $HOSTNAME. Это не покажет, потому что это не там. Вы можете использовать set, чтобы увидеть все переменные, которые там есть (так как sh не имеет табуляции, его сложнее понять).

...