由于各种原因,我必须采用多个字符串(字符串可能包含多个单词)作为命令行输入。比如说,
./temp.sh "OS Lab" "Mad man" "Spiky Boii"
但我始终无法实现上述目标,因此要测试我写的其他所有内容。
while read -r line
do
array=("${array[@]}" "$line")
done
现在上面的代码满足了我的要求,因为它不是所要求的,我一直在尝试使用它来获得类似的功能。
for i in $*
do
array=("${array[@]}" "$i")
done
但如果我给出初始输入,这段代码需要 6 个数组元素。我怎样才能得到
array[0]="OS Lab"
array[1]="Mad man"
array[2]="Spiky Boii"
答案1
更改为$*
并$@
引用它:
for i in "$@"
do
array+=("$i")
done
或者,您可以简单地执行以下操作:
for i
do
array+=("$i")
done
另请注意,无需在每次迭代中包含数组的其余部分。您可以使用+=
向数组添加元素而不是每次都完全重置它。
然而如果您所做的只是将参数添加到数组中,您可以简单地执行以下操作:
array=("$@")
不需要循环。
从 bash 手册开始特殊参数:
(
$*
) 扩展到位置参数,从 1 开始。当扩展不在双引号内时,每个位置参数都会扩展为一个单独的单词。在执行它的上下文中,这些单词会受到进一步的单词分割和路径名扩展。当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由 IFS 特殊变量的第一个字符分隔。即,"$*"
相当于“$1c$2c…”,其中 c 是 IFS 变量值的第一个字符。如果未设置 IFS,则参数之间用空格分隔。如果 IFS 为空,则连接参数时不插入分隔符。
(
$@
) 扩展到位置参数,从 1 开始。在执行单词拆分的上下文中,这会将每个位置参数扩展为单独的单词;如果不在双引号内,这些单词将受到分词的影响。在不执行单词拆分的上下文中,这会扩展为单个单词,每个位置参数由空格分隔。当扩展发生在双引号内并执行分词时,每个参数都会扩展为一个单独的单词。也就是说,"$@"
相当于“$1”“$2”……。如果双引号扩展发生在单词内,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后部分连接。当没有位置参数时,"$@"
扩展$@
为空(即,它们被删除)。
从 bash 手册开始循环结构:
如果 'in Words' 不存在,则 for 命令会对设置的每个位置参数执行一次命令,就像已指定 'in "$@"' 一样
从 bash 手册开始外壳参数:
在赋值语句将值赋给 shell 变量或数组索引(请参阅数组)的上下文中,“+=”运算符可用于追加或添加到变量的先前值。