Перебрать массив строк в Bash? - PullRequest
1268 голосов
/ 16 января 2012

Я хочу написать скрипт, который перебирает 15 строк (возможно, массив?) Это возможно?

Что-то вроде:

for databaseName in listOfNames
then
  # Do something
end

Ответы [ 18 ]

5 голосов
/ 02 ноября 2012

Объявляемый массив не работает для оболочки Korn.Используйте приведенный ниже пример для оболочки Korn:

promote_sla_chk_lst="cdi xlob"

set -A promote_arry $promote_sla_chk_lst

for i in ${promote_arry[*]};
    do
            echo $i
    done
5 голосов
/ 02 сентября 2018

Простой способ:

arr=("sharlock"  "bomkesh"  "feluda" )  ##declare array

len=${#arr[*]}  # it returns the array length

#iterate with while loop
i=0
while [ $i -lt $len ]
do
    echo ${arr[$i]}
    i=$((i+1))
done


#iterate with for loop
for i in $arr
do
  echo $i
done

#iterate with splice
 echo ${arr[@]:0:3}
4 голосов
/ 17 октября 2016

Это похоже на ответ пользователя 2533809, но каждый файл будет выполняться как отдельная команда.

#!/bin/bash
names="RA
RB
R C
RD"

while read -r line; do
    echo line: "$line"
done <<< "$names"
3 голосов
/ 25 сентября 2014

Если вы используете оболочку Korn, существует " set -A databaseName ", иначе есть " объявляет -a databaseName "

Чтобы написать скрипт, работающий на всех оболочках,

 set -A databaseName=("db1" "db2" ....) ||
        declare -a databaseName=("db1" "db2" ....)
# now loop 
for dbname in "${arr[@]}"
do
   echo "$dbname"  # or whatever

done

Это должно работать на всех оболочках.

2 голосов
/ 12 сентября 2015

Возможная первая строка каждого скрипта / сессии Bash:

say() { for line in "${@}" ; do printf "%s\n" "${line}" ; done ; }

Использование, например ::

$ aa=( 7 -4 -e ) ; say "${aa[@]}"
7
-4
-e

Может рассмотреть: echo интерпретирует -e как вариант здесь

2 голосов
/ 17 января 2014

Попробуй это. Работает и проверено.

for k in "${array[@]}"
do
    echo $k
done

# For accessing with the echo command: echo ${array[0]}, ${array[1]}
2 голосов
/ 27 июня 2017

Однолинейный цикл,

 declare -a listOfNames=('db_a' 'db_b' 'db_c')
 for databaseName in ${listOfNames[@]}; do echo $databaseName; done;

вы получите такой вывод,

db_a
db_b
db_c
0 голосов
/ 08 декабря 2016

Я перебираю массив моих проектов для git pull обновления:

#!/bin/sh
projects="
web
ios
android
"
for project in $projects do
    cd  $HOME/develop/$project && git pull
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...