В bash я знаю, что можно написать for
цикл, в котором некоторая переменная управления цикла i
перебирает заданные целые числа. Например, я могу написать скрипт оболочки bash, который печатает целые числа от 1 до 10:
#!/bin/bash
for i in {1..10}
do
echo $i
done
Можно ли вместо этого перебрать переменную управления циклом, которая является строкой, если я предоставлю список строк? Например, предположим, что у меня есть строка, fname
которая представляет имя файла. Я хочу вызвать набор команд для каждого имени файла. Например, я мог бы хотеть напечатать содержание fname
использования команды как это:
#!/bin/bash
for fname in {"a.txt", "b.txt", "c.txt"}
do
echo $fname
done
Другими словами, на первой итерации fname
должно иметь значение fname="a.txt"
, а на второй итерации fname
должно иметь значение fname="b.txt"
и так далее. К сожалению, похоже, что приведенный выше синтаксис не совсем корректен. Я хотел бы получить вывод:
a.txt
b.txt
c.txt
но когда я пробую приведенный выше код, я получаю этот вывод:
{A.txt,
b.txt,
c.txt}
Не могли бы вы помочь мне определить правильный синтаксис, чтобы я мог итеративно изменять значение / содержимое переменной fname
? Спасибо за ваше время.
источник
{}
, вам не нужно ничего зацикливать (разделенный пробелами) список{}
и на,
с. Альтернатива состоит в том, чтобы удалить пробелы. Так что либо"a.txt" "b.txt" "c.txt"
или{"a.txt","b.txt","c.txt"}
. Но я предпочитаю{a..c}.txt
вместо этого.Ответы:
Правильный синтаксис выглядит следующим образом:
источник
fnames=( a.txt b.txt c.txt )
вы можете использовать синтаксисfor f in ${fnames[@]}; do echo $f; done
.for fname in a.txt b.txt c.txt
иfor fname in "a.txt" "b.txt" "c.txt"
дают одинаковые результаты?for f in "${fnames[@]}"; do echo $f; done
(с кавычками${fnames[@]}
), еслиfnames
значения могут содержать пробелы. И вы должны использовать"$f"
, особенно если вы делаете что-то более сложное, чемecho
(например,cat
илиcp
). (И даже если вы только делаетеecho
, вы должны использоватьprintf
вместо этого.)Мне кажется, вы должны просто сделать ...
источник
Как отметил пользователь 13742 в комментариях , мы можем использовать массивы в
bash
иksh
:И работает как так:
Однако некоторые оболочки, такие как
dash
(/bin/sh
в Ubuntu), не поддерживают массивы. В таком случае мы могли бы прибегнуть к использованию здесь-документа структуры:<<
источник