Аргумент разбора скрипта Bash с кавычками


8

Пожалуйста, рассмотрите этот простой скрипт с именем test :

#!/bin/bash
echo $1

и следующие команды и вызовы:

$ echo "A B"
A B
$ echo ""A B""
A B
$ echo """A B"""
A B
$ echo """A B"""
A B

$ ./test "A B"
A B
$ ./test ""A B""
A
$ ./test """A B"""
A B
$ ./test """"A B""""
A

Может кто-нибудь объяснить, почему вызов test не ведет себя как команда echo или не указывает на соответствующую документацию?


2
Уже есть тестовая команда, вам повезло, что вы использовали полный путь, в противном случае вам было бы сложно отладить ситуацию.
Руи Ф Рибейро

3
Лучше для такого типа теста использовать, printf '%q\n' "$@"а echoне вообще, который будет выдавать ваши аргументы один на один со скрытыми символами и пробелами, экранированными в видимой форме.
Чарльз Даффи

Ответы:


13

Потому что echoобъединяет все аргументы it для их печати, и ваш скрипт ограничивается первым аргументом. Вы должны использовать, "$@"а не $1в вашем сценарии.

Давайте посмотрим на аргументы, которые вы предоставляете для своих тестов:

  • ./test "A B"
    • один аргумент, строка из 3 символов AspaceB
  • ./test ""A B""
    • два аргумента
      • во-первых, empty stringобъединены сA
      • во-вторых, соединены Bсempty string
  • ./test """A B"""
    • один аргумент, связанный empty stringс AspaceBконкатенацией сempty string
  • ./test """"A B""""
    • два аргумента
      • первый, empty stringсцепленный с empty stringсцепленным сA
      • во-вторых, соединенный Bс соединенным empty stringсempty string

Примечание: вы увидите результаты, отличные от того, echoесли бы вы использовали более одного пробела в своих аргументах. Это потому, что echo объединяет свои аргументы с одним пробелом:

$ echo "A   B"
A   B
$ echo ""A   B""
A B
$ echo """A   B"""
A   B
$ echo """"A   B""""
A B

это аккуратные маленькие пустые болваны.
mikeserv

2
точно, цитаты не гнездятся ...
mr.spuratic
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.