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

0 bash

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

./temp.sh "OS Lab" "Mad man" "Spiky Boii"
Run Code Online (Sandbox Code Playgroud)

但是我从来没有能够实现所说的目标,所以为了测试我写的其他所有内容。

while read -r line
do
    array=("${array[@]}" "$line")
done
Run Code Online (Sandbox Code Playgroud)

既然上面的代码满足了我的要求,因为这不是我所要求的,我一直在尝试使用它来获得类似的功能。

for i in $*
do  
    array=("${array[@]}" "$i")
done 
Run Code Online (Sandbox Code Playgroud)

但是如果我给出初始输入,这段代码需要 6 个数组元素。我怎么得到

array[0]="OS Lab"
array[1]="Mad man"
array[2]="Spiky Boii"
Run Code Online (Sandbox Code Playgroud)

jes*_*e_b 5

更改$*$@并引用它:

for i in "$@"
do  
  array+=("$i")
done 
Run Code Online (Sandbox Code Playgroud)

或者,您可以简单地执行以下操作:

for i
do  
  array+=("$i")
done 
Run Code Online (Sandbox Code Playgroud)

另请注意,每次迭代时无需包含数组的其余部分。您可以使用+=向数组添加元素,而不是每次都完全重置它。

但是,如果您所做的只是将参数添加到数组中,您可以简单地执行以下操作:

array=("$@")
Run Code Online (Sandbox Code Playgroud)

不需要循环。


从关于特殊参数的 bash 手册:

( $*) 扩展到位置参数,从 1 开始。当扩展不在双引号内时,每个位置参数扩展为一个单独的词。在执行它的上下文中,这些词会受到进一步的分词和路径名扩展。当扩展发生在双引号内时,它扩展为单个单词,每个参数的值由 IFS 特殊变量的第一个字符分隔。即,"$*"相当于“$1c$2c...”,其中c是IFS变量值的第一个字符。如果未设置 IFS,则参数以空格分隔。如果 IFS 为空,则连接参数时不插入分隔符。


( $@) 扩展到位置参数,从 1 开始。在执行分词的上下文中,这会将每个位置参数扩展为一个单独的词;如果不在双引号内,这些词会被分词。在不执行单词拆分的上下文中,这会扩展为单个单词,每个位置参数用空格分隔。当扩展发生在双引号内,并进行分词时,每个参数都扩展为一个单独的词。也就是说,"$@"相当于“$1”“$2”……。如果双引号扩展发生在一个词内,则第一个参数的扩展与原词的开头部分连接,最后一个参数的扩展与原词的最后部分连接。"$@"$@扩展为空(即,它们被删除)。


来自循环结构的 bash 手册:

如果 'in words' 不存在,则 for 命令为每个设置的位置参数执行一次命令,就好像已经指定了 'in "$@"'


从关于Shell 参数的 bash 手册:

在赋值语句为 shell 变量或数组索引(请参阅数组)赋值的上下文中,“+=”运算符可用于附加或添加到变量的先前值。