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)
更改$*
为$@
并引用它:
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 变量或数组索引(请参阅数组)赋值的上下文中,“+=”运算符可用于附加或添加到变量的先前值。
归档时间: |
|
查看次数: |
52 次 |
最近记录: |