【问题标题】:Using "while read" causes ambiguous redirect使用 \"while read\" 会导致不明确的重定向
【发布时间】:2022-10-25 11:21:21
【问题描述】:

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

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 redirectfi 是)我想问题出在第一行读取 data.txt 然后稍后在 read -r 上引用 $data 但我不完全确定出了什么问题。

有任何想法吗?

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

edit2:修复了循环内的“结果”错字。

编辑 3:data.txt 包含 UUID 列表:

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

【问题讨论】:

  • data.txt 包含什么? &lt; 后面必须跟一个文件名。
  • if [ result == counter ] 应该是 if [ $result == $counter ] 你错过了 $
  • 我怀疑你实际上想要done &lt; data.txt
  • 你为什么要把() 放在你的psql 电话周围?这将结果放在一个数组中,这是你想要的吗?
  • 在循环内设置变量results(复数),然后在if 语句中使用$result(单数)。

标签: linux bash for-loop while-loop


【解决方案1】:

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

要从字符串重定向,请改用&lt;&lt;&lt; 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

【讨论】:

  • 谢谢!正如 Barmar 在 cmets 上所建议的那样,如果您将 done < $data 替换为 done < data.txt,它也可以工作
猜你喜欢
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多