скрипт bash

Я читаю сценарий bash. Я не понимаю, что там происходит.

#!/bin/sh [ x$1 = x ] 

Что происходит во второй строке и что означает [ x$1 = x ] ?

5 Solutions collect form web for “скрипт bash”

Это проверяет, что $1 пуст, хотя он должен быть указан (идентичен [ -z "$1" ] ). Некоторые очень старые оболочки не обрабатывали пустые строки правильно, поэтому авторы переносимых скриптов приняли этот стиль проверки. Это не было необходимо десятилетиями, но люди все еще так поступают, потому что люди все еще так поступают.

Квадратные скобки указывают тест , поэтому [ x$1 = x] без if или что-то подобное не имеет смысла, хотя синтаксически нормально.

Он предназначен для вычисления true, если x$1 расширяется до x , а false в противном случае, но поскольку он некорректен, если $1 является (например) «hey x», оболочка увидит x = x , поэтому эта конструкция все еще небезопасна.

Цель проверки x = x – определить, является ли переменная пустой. Более общий способ сделать это – просто использовать кавычки:

 if [ "$1" = "" ]; then 

Операторы теста Bash -z и -n также могут использоваться, но они менее переносимы для других типов оболочек. 1

Причина кавычек или x$1 заключается в том, что левая сторона не расширяется до нуля, что является синтаксической ошибкой:

 if [ = x ] # No good! if [ "" = "" ] # Okay. if [ x = x ] # Also okay. 

1. На самом деле, test может быть автономной утилитой, но большинство оболочек реализуют ее как встроенную; проверьте разницу между which test и type test . В заявлении пользователя GNU / Linux претендуют на использование встроенного устройства, но если вы вызываете (например) /usr/bin/test , эта утилита, похоже, реализует функции, задокументированные на странице руководства, включая -z и -n .

 [ x$1 = x ] 

Только имеет смысл в zsh . Это сравнивает конкатенацию x с первым аргументом скрипта на x . Таким образом, команда [ command возвращает true, если $1 пуст или не предоставляется.

 [ $1 = "" ] 

Не работает, потому что в zsh когда пустая переменная не цитируется в контекстах списка, она вообще не сводится к аргументу без пустого аргумента, поэтому, если $1 не задан или пуст, команда [ будет получена только в качестве аргументов [ , = , пустая строка и ] которой она не может быть понятна. [ -z "$1" ] или [ "$1" = "" ] были бы в порядке, как в оболочках POSIX.

В оболочках Bourne-like / POSIX [ x$1 = x ] не имеет смысла. Это оператор split + glob каким-то образом применяется к конкатенации x и первому аргументу скрипта, надеясь, что результат и = и x и ] составят допустимое тестовое выражение для команды [ .

Например, если скрипт был передан один " = x -ox =" , [ получит эти аргументы: [ , x , = , x , -o , x , = , x , ] , которые [ будут понимать как сравнение x с x и x с x и вернуть true.

Если $1 были "* *" , то оболочка передала бы [ команду список файлов в текущем каталоге, имя которого начинается с x (расширение glob x* ), затем список не скрытых файлов (расширение * ) … который [ вряд ли сможет сделать какой-либо смысл. Единственные случаи, когда это могло бы сделать что-нибудь разумное, – это если $1 не содержит подстановочные или пустые символы.

Теперь, что вы иногда находите, это код вроде:

 [ "x$1" = x ] 

Это используется для проверки, если $1 пуст или не установлен.

Обычный способ проверки пустой или неустановленной переменной:

 [ -z "$1" ] 

Но это не удается для некоторых значений $1 like = в некоторых (не POSIX) [ реализациях, таких как встроенный в оболочку Bourne, который был найден как /bin/sh на Solaris 10 и раньше или в некоторых старых версиях dash (до 0,5. 4) или sh некоторых BSD.

Это потому, что [ видит [ , -z , = , ] и жалуется на отсутствие аргументов для оператора = binary вместо того, чтобы понимать его как -z унарный оператор, применяемый к строке = .

Аналогично, [ "$1" = "" ] не выполняется для некоторых реализаций [ если $1 есть ! или ( .

В этих оболочках / [ реализациях:

 [ "x$1" = x ] 

всегда является действительным тестом независимо от значения $1 , а именно:

 [ "" = "$1" ] 

а также:

 [ -z "${1:+x}" ] 

а также

 case $1 in "") ...; esac 

Конечно, если вы хотите проверить, что аргументы отсутствуют, вы должны:

 [ "$#" -eq 0 ] 

То есть вы проверяете количество аргументов, переданных скрипту.

Обратите внимание, что в настоящее время [ -z "$var" ] явно указывается POSIX и не может терпеть неудачу в соответствии с [ реализациями (и bash 's [ существует и существует на протяжении десятилетий). Таким образом, вы должны быть в состоянии полагаться на него в сценариях POSIX sh или bash .

x$1 объединяет две строки x и $1 а если $ 1 пуст, x $ 1 равно x, а в результате будет [x $ 1 = x]. x = y используется для сравнения строки в sh

[ x$1 = x ] истинно, если $1 не задано / null / пусто или нет.
Попробуйте сами:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
а также
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"

  • Меньше знака после выполнения в сценарии оболочки
  • Каково значение $ {# 1}?
  • csh: Как сохранить среду оболочки (env, current dir, shell history) в файле и установить ее в другой оболочке?
  • Команда nmcli принимает только первую строку ssid?
  • Как получить длинный список для одного каталога?
  • Я переместил новую программу в папку bin, но ничего не происходит, когда я пытаюсь запустить ее
  • Каковы оболочки Linux, которые позволяют управлять сетевым трафиком (отправка / получение данных в / из `/ dev / tcp / host / port`) через перенаправители?
  • как выключить другие компьютеры, используя свои IP-адреса в сценарии оболочки
  • скрипт crontab по сравнению с ручным запуском
  • Результаты задания Cron отличаются от выполнения из собственной оболочки
  • Использование сдвига $ (($ OPTIND -1))
  • Interesting Posts

    Ядро Linux IPv6 поиск маршрута – как он работает?

    Почему при перезагрузке изменяется файл / etc / machine-id?

    Команда grep не поддерживает начало «^» и «$» конца привязки строк, когда она с -Pz

    почему iozone не генерирует выходной файл?

    Как я могу запустить сценарий, когда определенный порт становится доступным для запросов?

    Почему debian unstable предпочитает устанавливать cgmanager?

    Управление настройками из каталога / sys в arch

    вызов bash с опцией -t

    Как использовать открытый ключ для входа в SSH лучше, чем использование пароля?

    Как сбросить все ключи привязки в моем Bash?

    Эквивалент subinacl.exe на linux / unix?

    getpriority возвращает различное значение для разных хостов с одинаковой версией ядра

    «Запасной» диск в массиве RAID-массива 2-disk mdadm?

    Смена устройства в pavucontrol не постоянно обновляет устройства воспроизведения

    Как заменить слово внутри файла .DOCX с помощью командной строки Linux?

    Linux и Unix - лучшая ОС в мире.