Список строк, массив или последовательность элементов можно итерировать с помощью цикла for в bash. Как можно итерировать список строк в Bash с помощью цикла for, показано в этом уроке на примере различных сценариев bash.
Пример: Итерация строки из нескольких слов в цикле for
Создайте bash-файл с именем "test.sh" и добавьте в него следующий сценарий. В цикле for используется строковое значение с пробелами. По умолчанию строковое значение разделяется пробелом. Цикл for разделит строку на слова и выведет каждое слово, добавляя новую строку.
1 2 3 4 5 6 | #!/bin/bash # Чтение строки с пробелами с помощью цикла for for value in vidi vici veni do echo $value done |
Вывод:
1 | bash test.sh |
Пример 2: Итерация строковой переменной с помощью цикла for
Создайте файл bash с именем "test.sh" и добавьте в него следующий сценарий. Присвойте текст переменной StringVal и считайте значение этой переменной с помощью цикла for. Этот пример также будет работать, как и предыдущий, и делить значение переменной на слова, основываясь на пробеле.
1 2 3 4 5 6 7 8 | #!/bin/bash # Определите строковую переменную со значением StringVal=""Example2 vidi vici veni" # Итерация строковой переменной с помощью цикла for for val in $StringVal; do echo $val done |
Вывод:
1 | bash test.sh |
Пример 3: Итерация массива строковых значений
Создайте bash-файл с именем 'test.sh' и добавьте в него следующий скрипт. В этом скрипте массив строковых значений объявлен с типом type. Два значения в массиве, которые содержат пробел, это "Linux Mint" и "Red Hat Linux". Этот скрипт сгенерирует вывод, разбив эти значения на несколько слов и выведя их как отдельные значения. Но это не является правильным выводом. Решение этой проблемы показано в следующем примере.
1 2 3 4 5 6 7 8 9 | #!/bin/bash # Объявляем массив строк с типом declare -a StringArray=("Linux Mint" "Fedora" "Red Hat Linux" "Ubuntu" "Debian" ) # Итерация массива строк с помощью цикла for for val in ${StringArray[@]}; do echo $val done |
Вывод:
1 | bash test.sh |
Пример 4: Вывод строкового значения из нескольких слов как одного значения
Создайте bash-файл с именем "test.sh" и добавьте в него следующий сценарий. В этом примере каждый элемент переменной массива StringArray содержит значения из двух слов. Чтобы вывести каждое значение без разбиения и решить проблему предыдущего примера, достаточно заключить переменную массива в двойные кавычки внутри цикла for.
1 2 3 4 5 6 7 8 9 | #!/bin/bash # Объявляем массив строк с типом declare -a StringArray=("Windows XP" "Windows 10" "Windows ME" "Windows 8.1" "Windows Server 2016" ) # Прочитайте значения массива через пробел for val in "${StringArray[@]}"; do echo $val done |
Вывод:
1 | bash test.sh |
Пример 5: Итерация строковых значений массива с помощью '*'
Создайте bash-файл с именем "test.sh" со следующим кодом. Здесь символ '*' используется для чтения всех строковых значений массива. Первый цикл for используется для отображения значений массива в нескольких строках, а второй цикл for - для отображения значений массива в одной строке.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/bash #Объявляем строковый массив LanguageArray=("PHP" "Java" "C#" "C++" "VB.Net" "Python" "Perl") # Выведите значения массива в строках echo "Выведите каждый элемент в новой строке" for val1 in ${LanguageArray[*]}; do echo $val1 done echo "" # Вывести значения массива в одной строке echo "Вывести все элементы в одной строке" for val2 in "${LanguageArray[*]}"; do echo $val2 done echo "" |
Вывод:
1 | bash test.sh |
Пример 6: Итерация строковых значений, разделенных запятыми
Создайте новый bash-файл с именем "test.sh" со следующим кодом. Здесь запятая (,) используется для разделения строковых значений. Переменная IFS используется для установки разделителя полей.
1 2 3 4 5 6 7 8 9 10 11 12 | #!/bin/bash DataList=" HTML5, CCS3, BootStrap, JQuery " Field_Separator=$IFS # установить запятую в качестве внутреннего разделителя полей для списка строк IFS=, for val in $DataList; do echo $val done IFS=$Field_Separator |
Вывод:
1 | bash test.sh |
Пример 7: Совместное чтение нескольких строковых массивов
Создайте bash-файл с именем 'test.sh' и добавьте в него следующий сценарий. В этом примере два строковых массива определены и объединены в один массив. Внешний цикл for используется для чтения объединенного массива, а внутренний цикл for - для чтения каждого внутреннего массива.
1 2 3 4 5 6 7 8 | #!/bin/bash str_array1=("Magento" "WooCommerce") str_array2=("CodeIgnitor" "Laravel") combine=(str_array1 str_array2) for arrItem in ${combine[@]} do eval 'for val in "${'$arrItem'[@]}";do echo "$val";done' done |
Вывод:
1 | bash test.sh |
Пример 8: Использование шаблона для чтения списка строк
Создайте новый bash-файл с именем test.sh со следующим кодом. Здесь шаблон '/, /' используется для разделения строковых значений на основе запятой.
1 2 3 4 5 6 7 8 9 | #!/bin/bash # Определяем список строковых переменных stringList=WordPress,Joomla,Magento # Используем запятую в качестве разделителя и применяем шаблон for val in ${stringList//,/ } do echo $val done |
Вывод:
1 | bash test.sh |
Пример 9: Чтение многострочной переменной
Создайте новый bash-файл с именем test.sh со следующим кодом. В данном примере мы создаем переменную,содердащую множество строк. В качестве символа раздлелитетеля символ конца строки, так же добовляем в цикл счетчик, что бы видеть что вывод происходит посмотрочно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #!/bin/bash # создаем многострочную переменную StringList=$(cat <<-END This is line one. This is line two. This is line three. END ) Field_Separator=$IFS IFS=$'\n' c=0 for val in $StringList; do let c=$c+1 echo "$c $val" done IFS=$Field_Separator |
Вывод:
1 | bash test.sh |