Предположим, у вас есть переменная t1
, которая содержит набор значений, разделенных запятыми:
t1=$(GetValueOfT1) # For example t1='123,456,789'
Вы можете применить каждое из них по очереди с помощью такого цикла
OIFS="$IFS" IFS=,
for v in $t1
do
echo "Processing with v=$v:" >&2
mv "$SRC_PATH/ABC_${v}.dat" "$DEST_PATH/ABC_${v}_$$.dat"
done
IFS="$OIFS"
Первый $ t1
нельзя заключать в кавычки, потому что оболочка должна разделять значение по символам запятой. (Это контролируется переменной оболочки $ IFS
, которую мы сохраняем, чтобы мы могли восстановить ее в конце цикла.) Все остальные переменные должны быть заключены в кавычки, чтобы защитить их от неожиданного разделения слов на пробелы. , запятые и т. д. Наконец, вы должны представить $ v
как $ {v}
, потому что в противном случае оболочка будет включать следующий за ним символ _
как часть имя переменной, а $ v_
- это не то, что нам нужно.
Я бы порекомендовал вам префикс mv
с помощью echo
(т.е. echo mv ...
), прежде чем запускать это на практике, чтобы вы могли проверить вывод, прежде чем он что-либо изменит.
Когда вы указываете pv
файл в качестве аргумента командной строки, он действует как cat
и отображает файл , и отслеживает прогресс этого вывода, который вы видите. Эта форма полезна, если вы используете pv
для передачи файла медленному процессу (используя канал); на странице руководства есть примеры.
Вы можете подумать о сохранении вывода
dpkg-query --show -f '${source:Package}\n' | sort -u
в файл и использовании pv
для передачи его в цикл, вызывающий bts select
, но полученный файл настолько короткий, что он помещается в буфер и pv
считает, что он был обработан, прежде чем фактически начинается обработка.
Итак, вам нужно отслеживать прогресс вручную:
#!/bin/sh
file=$(mktemp)
dpkg-query --show -f '${source:Package}\n' | sort -u > ${file}
lines=$(wc -l ${file} | cut -f1 -d\ )
line=0
while read source; do
line=$((line + 1))
printf "Processing line %d / %d\r" ${line} ${lines} >&2
bts select source:${source} tag:patch | sed "s/^/${source} /g"
done < ${file} | sort -k2,2n -r
rm ${file}
echo "Done " >&2
Я позволю вам адаптировать это, чтобы использовать красивую полосу выполнения, используя примеры в Как добавить индикатор выполнения в сценарий оболочки? .
Если вы выберете время для команды,вы можете использовать этот индикатор выполнения
При использовании полублочных символов все идет гладко
Пример
Еще один вариант, который не всегда доступен, — обновлять индикатор выполнения не в зависимости от времени, а в определенных точках вашего скрипта.
code
set_progress 10
code
set_progress 20
...
code
set_progress 100