Ошибка при чтении файла с помощью Bash

Я хочу прочитать файл в сценарии 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:
0
16.06.2020, 21:59
2 ответа

Переменная 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с начала строки ^, за которой следует любое количество пробелов, совпадающих только один раз в строке.

3
18.03.2021, 23:26

Вы можете использовать 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[@]}"
1
18.03.2021, 23:26

Теги

Похожие вопросы