Я хочу прочитать файл в сценарии bash со следующим кодом:
#!/bin/bash
file=$(sort "$1" | cut -f 1 -d "," | uniq -c | sed 's/^ *//g')
while IFS= read -r line
do
echo "$line"
done < "$file"
Но в конце файла я всегда получаю эту ошибку:
File name too long
Почему это происходит? И в начале я получаю этот вывод, но не хочу:
script.sh: line 8:
Переменная file
не содержит имени файла после обработки. Если вы хотите обработать вывод своей команды, вы можете использовать подстановку процесса<(...)
:
#!/bin/bash
while IFS= read -r line; do
printf '%s\n' "$line"
done < <(sort "$1" | cut -f1 -d, | uniq -c | sed 's/^ *//')
Обратите внимание, что я удалил g
в вашем скрипте sed
с начала строки ^
, за которой следует любое количество пробелов, совпадающих только один раз в строке.
Вы можете использовать Here String для перенаправления в цикл while
data=$(sort "$1" | cut -f 1 -d "," | uniq -c | sed 's/^ *//')
while IFS= read -r line; do
echo "$line"
done <<< "$data"
Или запишите выходные данные конвейера в массив с помощью readarray
readarray -t data < <(sort "$1" | cut -f 1 -d "," | uniq -c | sed 's/^ *//')
for line in "${data[@]}"; do
echo "$line"
done
# to print without a loop:
printf "%s\n" "${data[@]}"