Bash脚本:将数组作为参数传递给函数并打印数组
我将一个数组传递给一个函数,并尝试打印数组的每个元素 以下是在数组参数周围加引号的代码段:Bash脚本:将数组作为参数传递给函数并打印数组,bash,Bash,我将一个数组传递给一个函数,并尝试打印数组的每个元素 以下是在数组参数周围加引号的代码段: #!/bin/bash print_array () { array=$@ for i in "${array[@]}" #with quotes do echo $i done } ar=("1. a" "2. b" "3. c") print_array ${ar[@]} #!/bin/bash p
#!/bin/bash
print_array ()
{
array=$@
for i in "${array[@]}" #with quotes
do
echo $i
done
}
ar=("1. a" "2. b" "3. c")
print_array ${ar[@]}
#!/bin/bash
print_array ()
{
array=$@
for i in ${array[@]} #without quotes
do
echo $i
done
}
ar=("1. a" "2. b" "3. c")
print_array ${ar[@]}
当我执行上面的脚本时,输出是
1. a 2. b 3. c
1.
a
2.
b
3.
c
以下是数组参数周围不带引号的代码段:
#!/bin/bash
print_array ()
{
array=$@
for i in "${array[@]}" #with quotes
do
echo $i
done
}
ar=("1. a" "2. b" "3. c")
print_array ${ar[@]}
#!/bin/bash
print_array ()
{
array=$@
for i in ${array[@]} #without quotes
do
echo $i
done
}
ar=("1. a" "2. b" "3. c")
print_array ${ar[@]}
当我执行上面的脚本时,输出是
1. a 2. b 3. c
1.
a
2.
b
3.
c
输出根据数组参数周围的引号而变化。
我真的对显示的输出感到困惑。请帮我解决这个问题
预期产出应为:
1. a
2. b
3. c
如果您想解释,可以在“$@”中为i编写
你也可以写:
#!/bin/bash
print_array ()
{
array=("$@")
for i in "${array[@]}"; do
printf "%s\n" "$i"
done
}
ar=("1. a" "2. b" "3. c")
print_array "${ar[@]}" # with quotes
如果您想解释,可以在“$@”中为i编写
你也可以写:
#!/bin/bash
print_array ()
{
array=("$@")
for i in "${array[@]}"; do
printf "%s\n" "$i"
done
}
ar=("1. a" "2. b" "3. c")
print_array "${ar[@]}" # with quotes
结果:
1. a
2. b
3. c
赋值期间使用=()将变量保持为数组
结果:
1. a
2. b
3. c
在赋值过程中使用=()将变量保持为数组。不能将数组复制到标量中--标量只能保存单个数组元素,但不能超过该值而不丢失数据。不能将数组复制到标量中--标量只能保存单个数组元素,但不能超过该值而不丢失数据。IOW,
$@
是字符串,(“$@”)
是数组($@)
也是一个数组,但元素数不同。@sach,在函数内部和外部使用相同的名称array
实际上是一个坏主意,因为默认情况下(没有显式的local
声明),函数定义中的变量在作用域中实际上是全局的。@williampersell,为什么必须使用引号才能获得所需的输出。@sach,如果不使用引号,则会得到字符串拆分和全局扩展,因此字符串中的单个单词(通过在IFS中拆分字符来区分)将作为单个参数传递。为了获得更多的乐趣,请尝试在数组元素中传递由空格包围的文字星号字符,您将看到当您不引用时glob expansion会做什么。@sach,我不强烈推荐任何死树引用,但(以及常见问题解答、陷阱页等)上的文档是一个不错的选择(由那些非常关心正确性并展示良好实践的人积极维护)。注意,$@
是一个字符串,(“$@”)
是一个数组。($@)
也是一个数组,但元素数不同。@sach在函数内外使用相同的名称array
,实际上是一个坏主意,因为默认情况下(没有明确的local
声明),函数定义中的变量实际上在作用域中是全局的。@Williampersell,为什么引号是必需的,才能得到所需的输出。@sach,如果不引号,则会得到字符串拆分和全局扩展,因此字符串中的单个字(通过在IFS中拆分字符来区分)作为单独的参数传递。为了增加乐趣,请尝试在数组元素中传递由空格包围的文字星号字符,您将看到当您不引用时glob expansion会做什么。@sach,我不强烈推荐任何死树引用,但推荐位于的文档(以及常见问题解答、陷阱页等)是一个很好的选择(由那些非常关心正确性并展示良好实践的人积极维护)。