我想使用以下代码读取 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[@]}"