Почему эти вложенные параметры в скрипте оболочки POSIX разбиваются по словам?

Почему эти вложенные параметры в скрипте оболочки POSIX разбиваются по словам?

У меня есть скрипт 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/shdash.

решение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 "$@"

Связанный контент