当我在字符串中获取数组的内容时,我有以下2个解决方案:
$ a=('one' 'two')
$ str1="${a[*]}" && str2="${a[@]}"
当然,我可以在代码上重用我的字符串 但我怎么知道我的变量只有一个或几个单词?
答案 0 :(得分:2)
在这两种情况下,数组的内容都连接成一个字符串并分配给变量。唯一的区别是用于连接元素的内容。使用${a[*]}
时,会使用IFS
的第一个字符。使用${a[@]}
时,始终使用单个空格。
$ a=(one two)
$ IFS="-"
$ str1="${a[*]}"
$ str2="${a[@]}"
$ echo "$str1"
one-two
$ echo "$str2"
one two
在不引用的情况下展开$str1
或$str2
时,无论最初如何定义变量,结果字的数量完全取决于IFS
的当前值。当然,"$str1"
和"$str2"
每个都会扩展为一个单词。
答案 1 :(得分:0)
要添加@chepner的好答案:${arr[*]}
和${arr[@]}
之间的差异与$*
和$@
之间的差异非常相似。您可能需要参阅此帖子,其中涉及$*
和$@
:
What's the difference between $@ and $* in UNIX?
根据经验,使用"$@"
和"${arr[@]}"
比使用不带引号或*
对应物更好。
答案 2 :(得分:0)
"${a[*]}"
一起扩展为一个字符串,每个条目"${a[@]}"
扩展为一个字符串。
假设我们有一个程序printParameters
,它为每个参数($1
,$2
等等)打印字符串my ... parameter is ...
。
>_ a=('one' 'two')
>_ printParameters "${a[*]}"
my 1. parameter is one two
>_ printParameters "${a[@]}"
my 1. parameter is one
my 2. parameter is two
如果要手动展开数组,则会写入
${a[*]}
为"one two"
和
${a[@]}
为"one" "two"
。
关于IFS
等也存在差异(参见其他答案)。通常@
是更好的选择,但*
方式更快 - 在必须处理大型数组且不需要单独的参数的情况下使用后者。
顺便说一下:脚本printParameters
可以写成
#! /bin/bash
argIndex=0
for argValue in "$@"; do
echo "my $((++i)). argument is $argValue"
done
通过尝试和错误了解有关扩展的更多信息非常有用。