
У меня есть следующая команда в скрипте Linux.
#!/bin/bash
for i in "001 ARG1" "002 ARG2" "003 ARG3"
do
set -- $i
echo $1
echo $2
done
001 и ARG1 по сути являются кортежами,
Есть ли способ переместить эти кортежи в текстовый файл, который я могу загрузить вместо этого в forloop? так много, что я бы сохранил текстовый файл, как этот
ARG1
ARG2
ARG3
или
001 ARG1
002 ARG2
003 ARG3
И сценарий будет таким
for i in textfile.txt
do
set -- $i
echo $1
echo $2
done
и получить тот же результат?
также есть ли способ сделать так, чтобы 001 002 подсчитывались автоматически? Например, как в python можно установить counter = 0 и counter+=1 и назначить переменную.
решение1
В каждой строке файла даны два слова, разделенные пробелом или табуляцией, как во втором примере входного файла:
while read -r word1 word2; do
echo "$word1"
echo "$word2"
done <textfile.txt
Это приведет к считыванию первого слова в каждой строке в $word1
, а остальной части строки в $word2
.
Входные данные для read
задаются входными данными while
составной команды, которая получает их из файла посредством перенаправления.
Параметр -r
запрещает read
интерпретировать этот \
символ каким-либо особым образом, если он встречается во входных данных.
По одному слову в строке и счетчику:
counter=0
while read -r word; do
counter=$(( counter + 1 ))
echo "$counter"
echo "$word"
done <textfile.txt
Это увеличит счетчик на единицу в каждой итерации (для каждой строки, считанной из textfile.txt
).
Чтобы получить трехзначный счетчик, заполненный нулями, выведите счетчик, используя printf
строку форматирования %.3d\n
:
printf '%.3d\n' "$counter"
... на месте echo "$counter"
.
Описание того, что это %.3d\n
значит, см. в документации функции библиотеки C printf
( man 3 printf
, эквивалент оболочки использует в основном ту же строку формата).