Это потому, что когда вы передаете $2
в результате расширения параметра из 1.sh
, вы цитируете его таким образом, что --two TEST_TWO
оценивается как один единственный аргумент, так что количество аргументов в 2.sh
результат в 4
вместо 5
Но, тем не менее, использование вашего $2
в качестве ${TWO:+--two ${TWO}}
решит проблему, но это разделит слово на содержимое $2
, если оно содержит пробелы,Вам нужно использовать массивы.
В качестве гораздо более рекомендуемого и безотказного подхода используйте массивы, указанные ниже, для 1.sh
как
argsList=(--one "${ONE}" ${TWO:+--two "${TWO}"} --other)
и передайте их как
./2.sh "${argsList[@]}"
или если вы знакомы с тем, как работают правила цитирования (как и когда заключать в кавычки, чтобы не допустить разделения слов), используйте его непосредственно в командной строке, как показано ниже.Это обеспечит сохранение переменных содержимого ONE
и TWO
, даже если они имеют пробелы.
./2.sh \
--one "${ONE}" \
${TWO:+--two "${TWO}"} \
--other
В качестве нескольких рекомендуемых рекомендаций
- Всегда используйте строчные буквыимена переменных для пользовательских переменных, чтобы не путать их с переменными среды, поддерживаемыми самой оболочкой.
- Использовать
getopts()
для более надежного анализа флагов аргументов