使用 "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
我有这个非常简单的脚本:
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