У меня есть скрипт count_args
, который подсчитывает аргументы:
#!/bin/sh
echo $#
Если я вызову его с этими параметрами, он сообщит мне, что получит два аргумента:
$ ./count_args --options '1 2'
2
Но если я сконструирую аргументы в скрипте test_args
следующим образом:
#!/bin/sh
ARGS="--options '1 2'"
./count_args ${ARGS}
...я получаю результат:
$ ./test_args
3
Почему '1 2'
в скрипте происходит разделение? Как этого избежать в соответствии с POSIX,из вызывающего скрипта? Возможно ли каким-то образом сохранить аргументы в переменных, чтобы можно было разделить их в более сложных скриптах (например, с помощью ARGS_1
и ARGS_2
)?
Обратите внимание, что мой /bin/sh
— dash
.
решение1
В первом случае переданные аргументы count_args
были интерпретированы оболочкой, оболочка увидела два слова --options
и 1 2
передала их count_args
.
Во втором случае, внутри двойных кавычек, все символы, кроме $
и , \
обрабатываются как литералы. Для оболочки слишком поздно интерпретировать одинарные кавычки, оболочка видит содержимое $ARGS
переменной как длинную строку --options '1 2'
, все символы как литералы и не имеют особого значения для оболочки.
Использование ${ARGS}
без двойных кавычек сделало его подверженным разделению полей и расширению имени файла. При значении по умолчанию IFS
вы получили три разделенных слова: --options
, '1
и 2'
.
Лучший способ архивации — использовать "$@"
:
#!/bin/sh
set -- --options '1 2'
./count_args "$@"