使用 "while read" 会导致不明确的重定向

Using "while read" causes ambiguous redirect

我有这个非常简单的脚本:

data=$(<data.txt)
counter=10

#just a dbquery using $data
result=(`psql -X -t -AF $'\t' -h $POSTGRES_HOST -d $POSTGRES_DATABASE -U $POSTGRES_USERNAME  -w -c "select COUNT(field_value) from table where field_value in ($data)"`)

if [ $result == counter ]; then
    echo -e "\e[92m Success \e[39m"
  else
    while read -r dataLine;
      do
        result=(`psql -X -t -AF $'\t' -h $POSTGRES_HOST -d $POSTGRES_DATABASE -U $POSTGRES_USERNAME  -w -c "select field_value from fields where field_value = $dataLine" `)
        if [ -z "$result" ]; then
          echo "$dataLine failed"
        fi
      done < $data
fi

我得到 line 17: $data: ambiguous redirect(其中 fi 是)我想问题是第一行读取 data.txt 然后稍后在 read -r 上引用 $data 但我不太确定哪里出了问题。

有什么想法吗?

编辑:错误在第 17 行,而不是第 21 行。

edit2:修复了循环内的“结果”拼写错误。

edit3:data.txt 包含 UUID 列表:

'5dce6dcc-5368-4dc2-b26e-01b92c3dd3aa',
'6dab9b13-1734-4766-93f5-a96d0e0afd38',
'c365e709-296b-4e8e-acf9-1d9e252325f6'

< 重定向采用文件名,但您传递的是字符串数据。

要从字符串重定向,请改用 <<< here-string:

data=$(< data.txt)
cat <<< "$data"

或者如果您使用 sh 而不是 bash,请使用短 here-doc:

cat << end
$data
end

尽管直接从文件中读取会更好,因为这允许您流式传输任意数量的数据而无需先将其读入内存:

data="data.txt"
cat < "$data"

虽然不适用于这个问题,但为了未来读者的利益,如果您尝试从名称中包含空格的文件重定向,您也会收到此错误:

$ file="my file.txt"
$ cat < $file
bash: $file: ambiguous redirect

在这种情况下,您只需引用变量:

$ cat < "$file"
My file contents