使用 Bash 读取文件时出错

使用 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:

答案1

处理后该变量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^

答案2

你可以使用这里字符串用于重定向到 whileloop

data=$(sort "$1" | cut -f 1 -d "," | uniq -c | sed 's/^ *//')
while IFS= read -r line; do
    echo "$line"
done <<< "$data"

或者将管道输出捕获到数组中读取数组

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[@]}"

相关内容