Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Read命令正在分析多行输入_Bash_Shell_Parsing_Newline_Ifs - Fatal编程技术网

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"