Что оператор if только с переменной оценивает в bash? - PullRequest
0 голосов
/ 15 февраля 2019

Я изучаю bash --login и увидел, что команды в /etc/profile выполняются первыми.В этом файле:

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

По общему признанию, у меня ограниченное понимание потока управления в bash, но, насколько я понимаю, большую часть времени то, что я вижу в выражении if, является неким условным утверждением,является ли это [-a FILENAME] проверкой, существует ли файл или сравнение строк, обычно это что-то оценивает.

В файле меня смущают два оператора if:

if [ "$PS1" ]; и if[ "$BASH" ]

Я знаю, что PS1 является переменной дляосновной запрос, но это все, что в операторе if.Он не использует -a для проверки существования или сравнения его с чем-то другим.Мое обоснованное предположение состоит в том, что простое помещение переменной в истинное значение оценивает ее как истинное.

Мой вопрос Что это означает, если в оценках высказываются утверждения и почему?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Код if [ "$PS1" ]; и if [ "$BASH" ] проверяет, являются ли строки "$PS1" и "$BASH" пустыми, и делает что-то, если они есть;и поскольку у теста if [ "$BASH" ] есть соответствующий else, он также что-то делает, если $BASH пуст.

Полная форма выражения может быть более понятной, но все следующие эквиваленты эквивалентны:

test -n "$PS1"   # returns an exit code of `0` if `$PS1` is not empty, or `1` if not.

Короче:

test "$PS1" 

Короче:

[ -n "$PS1" ] 

Самый короткий:

[ "$PS1" ] 
0 голосов
/ 15 февраля 2019

[ "$var" ] возвращает true, если длина $var не равна нулю.Если var не установлено или пусто, возвращается false.

Это полезно:

  • [ "$PS1" ] будет иметь значение true только для интерактивный оболочки.

  • [ "$BASH" ] будет иметь значение true, только если оболочка является bash (в отличие от dash, ksh или zsh и т. Д.).

Примеры

Только одно из следующих значений имеет значение true:

$ unset x; [ "$x" ] && echo yes
$ x=""; [ "$x" ] && echo yes
$ x="a"; [ "$x" ] && echo yes
yes

Документация

Это задокументировано как в man bash, так и, как Гленн Джекман отмечает, в интерактивной справочной системе Bash.Для получения информации о команде [ введите:

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

Выше указано, что вы test.Запустите help test для получения более подробной информации:

$ help test | less

Прокрутите эту документацию и найдите:

  STRING      True if string is not empty.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...