Пожалуйста, рассмотрите этот простой скрипт с именем 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 или не указывает на соответствующую документацию?
shell-script
quoting
toliveira
источник
источник
printf '%q\n' "$@"
аecho
не вообще, который будет выдавать ваши аргументы один на один со скрытыми символами и пробелами, экранированными в видимой форме.Ответы:
Потому что
echo
объединяет все аргументы it для их печати, и ваш скрипт ограничивается первым аргументом. Вы должны использовать,"$@"
а не$1
в вашем сценарии.Давайте посмотрим на аргументы, которые вы предоставляете для своих тестов:
./test "A B"
./test ""A B""
./test """A B"""
./test """"A B""""
Примечание: вы увидите результаты, отличные от того,
echo
если бы вы использовали более одного пробела в своих аргументах. Это потому, что echo объединяет свои аргументы с одним пробелом:источник