Подтвердить что ты не робот

Как выполнить итерацию строк во внешнем файле с помощью оболочки?

Возможный дубликат:
Прокрутка содержимого файла в Bash?

У меня есть один файл со списком имен. Мне нужно пропустить все имена в этом файле из внешнего файла с оболочкой script. Как я могу это сделать?

Примеры файлов:

Сценарии/names.txt

alison
barb
charlie
david

Сценарии/script.sh

NAMES="" #names from names.txt file
for NAME in $NAMES; do
    echo "$NAME"
done

Как я могу взорвать файл names.txt в массив в отдельной оболочке script?

4b9b3361

Ответ 1

Один из способов:

while read NAME
do
    echo "$NAME"
done < names.txt

EDIT: Обратите внимание, что цикл выполняется в под-оболочке, поэтому любые измененные переменные будут локальными, за исключением случаев, когда вы объявляете их с declare вне цикла.

Деннис Уильямсон прав. Извините, должно быть, слишком часто использовались конвейерные конструкции и путались.

Ответ 2

Вам нужно будет использовать команду "читать"

while read name
do
    echo "$name"
done < names.txt

Обратите внимание, что "$ name" цитируется - если это не так, он будет разделен с использованием символов в $IFS в качестве разделителей. Это, вероятно, не будет замечено, если вы просто эхом отзываете переменную, но если ваш файл содержит список имен файлов, которые вы хотите скопировать, они будут разбиты на $IFS, если переменная некорректна, а это не что вы хотите или ожидаете.

Если вы хотите использовать подход Майка Кларка (загрузка в переменную, а не чтение), вы можете сделать это без использования cat:

NAMES="$(< scripts/names.txt)" #names from names.txt file
for NAME in $NAMES; do
    echo "$NAME"
done

Проблема заключается в том, что он загружает весь файл в $NAMES, когда вы его читаете, вы можете либо получить весь файл (если он указан), либо файл с разбивкой на $IFS, если он не указан, По умолчанию это даст вам отдельные слова, а не отдельные строки. Поэтому, если название "Мэри Джейн" появилось на линии, вы получите "Мэри" и "Джейн" в виде двух отдельных имен. Использование read обойдет это... хотя вы также можете изменить значение $IFS

Ответ 3

cat names.txt|while read line; do
    echo "$line";
done

Ответ 4

Я знаю, что пуристы будут ненавидеть этот метод, но вы можете cat файл.

NAMES=`cat scripts/names.txt` #names from names.txt file
for NAME in $NAMES; do
   echo "$NAME"
done

Ответ 5

Это может сработать для вас:

cat <<\! >names.txt
> alison
> barb
> charlie
> david
> !
OIFS=$IFS; IFS=$'\n'; NAMES=($(<names.txt)); IFS=$OIFS
echo "${NAMES[@]}"
alison barb charlie david
echo "${NAMES[0]}"
alison
for NAME in "${NAMES[@]}";do echo $NAME;done
alison
barb
charlie
david