Bash Read命令正在分析多行输入
下面代码中的Bash Read命令正在分析多行输入,bash,shell,parsing,newline,ifs,Bash,Shell,Parsing,Newline,Ifs,下面代码中的read命令仅解析输入的第一行。但是当IFS设置为逗号或除换行符以外的任何其他符号时,它工作正常 u="* john dan" IFS=$'\n';read -ra q <<< "$u" for j in "${q[@]}" do echo "drop user $j" done 我期待的是: drop user * drop user john drop user dan drop user * drop user john drop user d
read
命令仅解析输入的第一行。但是当IFS
设置为逗号或除换行符以外的任何其他符号时,它工作正常
u="*
john
dan"
IFS=$'\n';read -ra q <<< "$u"
for j in "${q[@]}"
do
echo "drop user $j"
done
我期待的是:
drop user *
drop user john
drop user dan
drop user *
drop user john
drop user dan
请注意,输入中的第一项是星号。因此,如果我使用下面的代码进行拆分,那么星号将扩展到目录中的文件列表
IFS=$'\n'; q=($u); unset IFS;
输出:
drop user abc
drop user test.sh
drop user john
drop user dan
上面的代码有什么问题?如何更正它以获得预期的输出?
read
仅从标准输入读取一行。如果您有Bash 4.0或更高版本,则可以使用readarray
:
readarray -t q <<< "$u"
readarray
(及其别名mapfile
)默认使用换行符分隔数组元素,因此可以删除IFS
赋值。bash4.4引入了一个-d
选项来使用除换行符以外的分隔符,但这里不需要
元素进入数组后,可以使用一条printf
语句打印命令,如下所示:
printf 'drop user %s\n' "${q[@]}"
read
仅从标准输入中读取一行。如果您有Bash 4.0或更高版本,则可以使用readarray
:
readarray -t q <<< "$u"
readarray
(及其别名mapfile
)默认使用换行符分隔数组元素,因此可以删除IFS
赋值。bash4.4引入了一个-d
选项来使用除换行符以外的分隔符,但这里不需要
元素进入数组后,可以使用一条printf
语句打印命令,如下所示:
printf 'drop user %s\n' "${q[@]}"
您可以在读取循环时执行此操作:
u="*
john
dan"
while IFS= read -r user; do
echo "drop user $user"
done <<< "$u"
您可以在读取循环时执行此操作:
u="*
john
dan"
while IFS= read -r user; do
echo "drop user $user"
done <<< "$u"