是否可以将多个句子作为命令行输入?

是否可以将多个句子作为命令行输入?

由于各种原因,我必须采用多个字符串(字符串可能包含多个单词)作为命令行输入。比如说,

./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 变量或数组索引(请参阅数组)的上下文中,“+=”运算符可用于追加或添加到变量的先前值。

相关内容