在Bash中将数组元素打印在单独的行上?

26 浏览
0 Comments

在Bash中将数组元素打印在单独的行上?

如何将Bash数组的数组元素打印在单独的行上?这个方法可以工作,但肯定有更好的方法:

$ my_array=(one two three)
$ for i in ${my_array[@]}; do echo $i; done
one
two
three

尝试了这个方法,但没有成功:

$ IFS=$'\n' echo ${my_array[*]}
one two three

0
0 Comments

问题: 在Bash中将数组的元素以单独的行打印出来的方法是什么?

原因: 在Bash中,如果想要将数组的元素以单独的行打印出来,直接使用echo命令打印数组变量可能会出现问题。因为echo命令会将数组的所有元素连在一起打印出来,而不是分行打印。这是因为在echo命令中,元素之间使用空格进行分隔,而不是换行符。

解决方法: 为了实现将数组的元素以单独的行打印出来,可以使用下面的代码:

(IFS=$'\n'; echo "${my_array[*]}")

在这段代码中,我们使用了一个子shell来设置IFS变量,并在echo命令中使用了"${my_array[*]}"来打印数组的所有元素。通过设置IFS为换行符,我们可以确保数组的每个元素都会分行打印出来。

这里使用了子shell是为了在使用完IFS变量后将其还原。由于Bash中的赋值发生在扩展之后,所以不能直接在一条命令中设置IFS并打印数组。

另外,还可以使用printf函数来实现将数组元素以单独的行打印出来的效果。使用printf函数时,可以使用"\n"来表示换行符,如下所示:

printf "%s\n" "${my_array[@]}"

通过将"%s\n"作为格式字符串传递给printf函数,并使用"${my_array[@]}"作为参数,我们可以将数组的所有元素以单独的行打印出来。

总结: 当需要在Bash中将数组的元素以单独的行打印出来时,可以使用子shell来设置IFS变量,并使用echo命令打印数组的所有元素。另外,也可以使用printf函数来实现相同的效果。这两种方法都能确保数组的每个元素都会以单独的行进行打印。

0
0 Comments

在Bash中,有时我们需要将数组的元素逐行打印出来。下面是一些常用的方法以及它们可能出现的问题和解决方法。

方法一:使用循环(for)遍历数组并打印每个元素。

for each in "${alpha[@]}"
do
  echo "$each"
done

这种方法很简单,可以逐行打印出数组alpha的所有元素。但是,如果数组中的元素包含了特殊字符“!”,那么这种方法会失败。

方法二:使用history命令来打印数组的元素。注意,如果数组中的元素包含了特殊字符“!”,那么这种方法也会失败。

history -p "${alpha[@]}"

方法三:使用basename命令来打印数组的元素。注意,如果数组中的元素包含了字符“/”,那么这种方法会失败。

basename -a "${alpha[@]}"

方法四:使用shuf命令来打印数组的元素。需要注意的是,使用shuf命令打印的结果可能不会按照原来的顺序排列。

shuf -e "${alpha[@]}"

在上述方法中,某些情况下使用shuf命令可能导致结果不按照顺序排列。但是,使用shuf命令来解决这个问题真的是个好主意吗?

实际上,我们可以使用以下方法来更可靠地解决这个问题:

histchars= history -p "${alpha[@]}"

这种方法可以确保所有的元素都按照顺序打印出来,而不会受到特殊字符的影响。

总结起来,要在Bash中将数组的元素逐行打印出来,我们可以使用循环、history命令、basename命令或者shuf命令。然而,这些方法都可能存在一些问题,如特殊字符的影响或结果无序等。为了更可靠地解决这个问题,我们可以使用histchars命令来保证所有的元素都按照顺序打印出来。

0
0 Comments

问题:如何在Bash中将数组的元素打印到单独的行上?

原因:在Bash中,如果不加引号,使用${my_array[@]}打印数组元素时,会将数组元素作为单独的参数进行展开、分割和通配。这可能会导致意外的结果。而使用"${my_array[@]}"可以确保每个元素作为一个单独的参数展开。

解决方法:使用printf命令将数组元素打印到单独的行上。具体命令:$ printf '%s\n' "${my_array[@]}"。这样可以确保每个数组元素都打印在一行上。

此外,在Bash中,$@$*之间也有一些区别:

- 在未加引号的情况下,结果是不确定的。在Bash中,$@$*都会展开为单独的参数,然后进行分割和通配。

- 在加引号的情况下,"$@"会将每个元素作为一个单独的参数展开,而"$*"会将参数合并为一个参数:"$1c$2c..."(其中cIFS的第一个字符)。

通常情况下,我们应该使用"$@"。同样,对于"${arr[@]}"也是如此。同时,确保在变量引用周围使用双引号非常重要,以确保具有内部空格的元素不会意外分割。

0