Как выполнить итерацию строк во внешнем файле с помощью оболочки?
Возможный дубликат:
Прокрутка содержимого файла в 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?
Ответы
Ответ 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