скрипт 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"

  • Количество и список вниз + расширенные функции
  • Как отключить трассировки bash?
  • Итеративный поток управления в подчиненном скрипте
  • «Меньше» эквивалент командной строки «tail -f»
  • Почему мой экранизированный сценарий не работает?
  • Как проверить, задан ли данный параметр в заданном массиве?
  • почему для цикла не возникает слишком длинная аргументация?
  • Bash перезаписывает первую строку, приглашение PS1 bash
  • Как вызвать другую часть скрипта с -x
  • Имена списков псевдонимов, функций и переменных в zsh
  • Сделать stdout и stderr буферизироваться одним и тем же буфером
  • getaddrinfo () из оболочки?
  • Linux и Unix - лучшая ОС в мире.