Arrays 在while循环中将空格分隔的字符串读入数组
我想在所有者中读取文件列表,然后将其与当前所有者进行比较,如果不相同,则输出一个错误 我有以下内容,为了简单起见,我用一个简单的回音替换了比较,因为不是比较出了问题:Arrays 在while循环中将空格分隔的字符串读入数组,arrays,bash,while-loop,spaces,ifs,Arrays,Bash,While Loop,Spaces,Ifs,我想在所有者中读取文件列表,然后将其与当前所有者进行比较,如果不相同,则输出一个错误 我有以下内容,为了简单起见,我用一个简单的回音替换了比较,因为不是比较出了问题: while IFS=' ' read -ra own; do echo ${own[@]}; done <<< $(stat -c %U file*.*) 在本例中,stat返回一个字符串列表3个值,在本例中所有值都带有我的用户名,但read只将其作为单个read and字符串输出 <myusername
while IFS=' ' read -ra own; do echo ${own[@]}; done <<< $(stat -c %U file*.*)
在本例中,stat返回一个字符串列表3个值,在本例中所有值都带有我的用户名,但read只将其作为单个read and字符串输出
<myusername> <myusername> <myusername>
澄清:我的意思是循环只处理一次,返回包含所有3个值的字符串,而我想要循环的3次迭代,每次包含一个值
我已经改为IFS=和IFS='\t',以防我以某种方式误读stat的输出,但即使我只是像这里这样定义一个字符串而不是stat命令,我也会得到相同的行为,所以我显然在做其他错误的事情
哦,我也需要它在一行语句中,所以如果这是问题所在,那么我想我有点搞砸了 为了获得数组的每个元素,可以使用for循环遍历变量own: 另一种方法是:
{ read -ra own; for i in ${own[@]}; do echo $i; done; } <<< $(stat -c %U file*.*)
请注意,您不需要while循环,因为所有内容都在一条线上 read-a在数组中指定自己的值。通过使用${own[@]}可以在一行中获得所有数组元素。这是正确的行为。。。你到底期待什么?@oliv我想我误解了我应该期待的。我希望每次读取一个值,而不是一次读取所有值。循环只返回一个值,其中包含所有3个值,而不是返回3个值。也就是说,循环只处理一次,而不是我想要的3次;do echo${own}:;更具体地说,只是为了明确迭代次数:而read-r是自己的;做ct++;echo${own}:${ct};done@urbanespaceman答案已更新,但在纯bash中进行字符串操作可能会导致问题。如果你想进一步描述一下你想用stat的结果做什么,那么像sed或awk这样的文本处理工具很可能会做得更好!谢谢@oliv。它最多只能读取6个文件,如果发现任何不属于当前用户的文件,它将返回错误状态,即将${own[@]}与$whoami进行比较,如果它们不相同,则退出1
{ read -ra own; for i in ${own[@]}; do echo $i; done; } <<< $(stat -c %U file*.*)