Я занимаюсь этим уже несколько дней, мне нужно проверить для пользователя $1, существует ли переменная окружения $2.
Я попробовал несколько случаев:
$ [[ -v a ]] && echo "a ok" || echo "a no"
a no
$ [[ -v $HOME ]] && echo "a ok" || echo "a no"
a no
(Так что нет (я пробовал на Bash > 4.2))
if [ su - ${1} -c "[ -z "${2}" ]" ]
Теперь я пробую этот подход, потому что не могу найти в чем проблема :/ !
su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
su - root -c "echo "$HOME" | wc | sed 's/ //g'"
решение1
Синтаксис в ваших первых примерах неверный. Если вы напишете:
[[ -v $HOME ]]
Тогда вы фактически выполняете команду:
[[ -v /home/yourusername ]]
Что, конечно, обречено на провал. Вы хотите:
[[ -v HOME ]] && echo ok || echo no
Вы можете объединить это, чтобы su
получить:
su - root -c "[[ -v HOME ]]" && echo ok || echo no
Ваши последние примеры не будут работать, потому что вы не можете вкладывать кавычки, и потому что расширение переменной оболочки происходит до выполнения команды. То есть, учитывая:
su - root -c "echo "$HOME" | wc | cut -d' ' -f2"
На самом деле команда, которую вы выполните, будет следующей:
su - root -c 'echo /home/somesuser | ...'
Если вам нужно значение $HOME
с точки зрения root
, вам нужно будет предотвратить расширение переменных в локальной оболочке, например, с помощью одинарных кавычек:
su - root -c 'echo $HOME | ...'
Мне не ясно, почему вы передаете вывод в wc
, потому что количество слов в $HOME
почти всегда будет 1
. Вместо того, чтобы постобрабатывать вывод wc
с помощью sed
или cut
, вы можете просто использовать -w
опцию для получения количества слов:
su - root -c 'echo $HOME | wc -w'