Ответ на
Есть ли способ скопировать список сценариев в новый объект, который можно проверить с помощью этой однострочной команды printf?
однозначно: «Да. Используйте массив, но делайте это правильно». Самый важный недостаток в моем примере кода был следующим
printf 'argarray:%s\n' "$argarray"
, который теперь исправлен ниже. Таким образом, имеет смысл регулярно создавать argarray
в начале скрипта. Затем сами аргументы сохраняются для дальнейшего использования.
Обратите внимание, что для массива еще один способ проверки элементов, не , доступный с самими аргументами, - declare -p argarray
.
Меньшие недостатки, теперь исправленные благодаря ответам, были
- Метод "перерасхода" для увеличения отсчетов
- Мой неточный термин "переменная", когда "строка" была бы понятнее
- Не давая понять, что я хотел не только узнать общее количество аргументов, но и отобразить их числовые индексы.
Я держу «строковую» обработку внизу этого примера кода, как напоминание о том, что превращение аргументов в строку - плохая идея.
#!/bin/bash
# Only for demonstration purposes, override all arguments.
set -- 'The dog ate the "mouse" ' but the cat?
# Create an array from script arguments.
declare -a argarray=( "$@" )
# Create a variable from script arguments.
argstring="$@"
# Various ways of trying to inspect script arguments.
printf 'arguments, printf:%s\n' "$@"
declare -p @
printf 'arguments indexed, loop:\n'
countargs="0"
for x in "${@}"
do
countargs=$((countargs+1));
printf '%s\n' "$countargs: '$x'"
done
printf '\n'
# Various ways of trying to inspect argarray.
printf 'argarray, printf:%s\n' "${argarray[@]}"
declare -p argarray
printf 'argarray indexed, loop:\n'
countargs="0"
for x in "${argarray[@]}"
do
countargs=$((countargs+1));
printf '%s\n' "$countargs: '$x'"
done
printf '\n'
# Various ways of trying to inspect argstring.
printf 'argstring, printf:%s\n' "$argstring"
declare -p argstring
printf 'argstring indexed, curly brackets, loop:\n'
countargs="0"
for x in "${argstring[@]}"
do
countargs=$((countargs+1));
printf '%s\n' "$countargs: '$x'"
done
printf 'argstring indexed, not bracketed, loop:\n'
countargs="0"
for x in $argstring
do
countargs=$((countargs+1));
printf '%s\n' "$countargs: '$x'"
done
printf '\n'
Результат:
> bash-example.sh
arguments, printf:The dog ate the "mouse"
arguments, printf:but
arguments, printf:the
arguments, printf:cat?
/Users/BNW/u/kh/bin/bash-example.sh: line 11: declare: @: not found
arguments indexed, loop:
1: 'The dog ate the "mouse" '
2: 'but'
3: 'the'
4: 'cat?'
argarray, printf:The dog ate the "mouse"
argarray, printf:but
argarray, printf:the
argarray, printf:cat?
declare -a argarray='([0]="The dog ate the \"mouse\" " [1]="but" [2]="the" [3]="cat?")'
argarray indexed, loop:
1: 'The dog ate the "mouse" '
2: 'but'
3: 'the'
4: 'cat?'
argstring, printf:The dog ate the "mouse" but the cat?
declare -- argstring="The dog ate the \"mouse\" but the cat?"
argstring indexed, curly brackets, loop:
1: 'The dog ate the "mouse" but the cat?'
argstring indexed, not bracketed, loop:
1: 'The'
2: 'dog'
3: 'ate'
4: 'the'
5: '"mouse"'
6: 'but'
7: 'the'
8: 'cat?'