для цикла, не работающего для нескольких строк

У меня есть массив, подобный этому "Apple Banana Clementine Date"

Я должен печатать так:

1. Apple 2. Banana 3. Clementine 4. Date 

Файл сценария:

 for i in "${fruits[@]}"; do echo "$lineno. $i " lineno+=1 done 

вывод myscript:

 1. Apple Banana Clem.... 

Я не понимаю, почему он не печатает lineno, а также почему он печатает длинный зазор b / w 1. и Apple . Благодарю.

2 Solutions collect form web for “для цикла, не работающего для нескольких строк”

Проблема заключается в вашем массиве. Кажется, что вы создали массив только с одним элементом. Попробуйте этот пример:

 array=("$(printf 'Apple\nBanana\nClementine\nDate')") for ((i = 0; i < ${#array[@]}; i++)); do printf '%d. %s\n' $((i+1)) "${array[$i]}" done j=0 for e in "${array[@]}"; do j=$((j+1)) printf '%d. %s\n' "$j" "$e" done k=0 for e in ${array[@]}; do k=$((k+1)) printf '%d. %s\n' "$k" "$e" done 

Затем выполните:

 $ ./test.sh 1. Apple Banana Clementine Date 1. Apple Banana Clementine Date 1. Apple 2. Banana 3. Clementine 4. Date 

Вы можете видеть, что на самом деле вы создаете массив, содержащий один элемент. 3-й цикл печатает четыре элемента, потому что оболочка выполнила разбиение поля на строку Apple\nBanana\nClementine\nDate , которая дала вам четыре отдельных слова назад.

Если вы измените массив на:

 set -f array=( $(printf 'Apple\nBanana\nClementine\nDate') ) set +f 

( set -f отключает расширение подстановочного знака, в случае, если символы *?\[ появляются на выходе команды), вы получите желаемый результат, который заключается в том, что вывод команды разбивается на пробел:

 $ ./test.sh 1. Apple 2. Banana 3. Clementine 4. Date 1. Apple 2. Banana 3. Clementine 4. Date 1. Apple 2. Banana 3. Clementine 4. Date 

Обратите внимание, что вы должны использовать двойные кавычки "${array[@]}" когда вы хотите выполнять итерацию по всем элементам массива или использовать цикл c-style для моего первого примера.

Это то, что вам нужно:

 [sreeraj@server ~]$ fruits=(Apple Banana Clementine Date) [sreeraj@server ~]$ (IFS=$'\n'; echo "${fruits[*]}") | nl 1 Apple 2 Banana 3 Clementine 4 Date [sreeraj@server ~]$ 
  • проверка статуса для команды sleep
  • Regex работает в оболочке, но не через скрипт Perl
  • Получение различных частей линии
  • как удалить ssh предупреждение в сценарии оболочки
  • Сценарий Bash для scp-интерпретации тильды (~) слишком рано
  • Как удалить все комментарии из файла?
  • TCL скрипт try catch
  • Создайте .tar.gz из каталога, опуская некоторые подкаталоги и добавляя только новые или измененные файлы
  • Повторяя что-то с несколькими кавычками и ключевыми символами (&, $,! И т. Д.),
  • bash one-liner: установить переменную на вывод команды или значение по умолчанию, если вывод пуст
  • ничего не записывается в текстовый файл, если вы запускаете из cron
  • Linux и Unix - лучшая ОС в мире.