Bash-数组作为参数
我在函数中使用数组作为参数时遇到问题Bash-数组作为参数,bash,Bash,我在函数中使用数组作为参数时遇到问题 #!/usr/bin/env bash function array_param { local ARRAY_s; local ARRAY_t; local OPTIND while getopts 's:t:' opt ; do case "$opt" in s) ARRAY_s=$OPTARG;; t) ARRAY_t=$OPTARG;; esac done shift $((OPT
#!/usr/bin/env bash
function array_param
{
local ARRAY_s; local ARRAY_t; local OPTIND
while getopts 's:t:' opt ; do
case "$opt" in
s) ARRAY_s=$OPTARG;;
t) ARRAY_t=$OPTARG;;
esac
done
shift $((OPTIND-1))
echo "ARRAY_s=${ARRAY_s[@]}; ARRAY_t=${ARRAY_t[@]}"
}
array_s=(100 200 300)
array_t=(0 10 3585)
array_param -s ${array_s} -t ${array_t}
为什么只有第一个元素分配给变量ARRAY_s和ARRAY_t
结果:
数组_s=100;数组_t=0
${array\u s}
相当于${array\u s[0]}
,这就是为什么只分配第一个元素:
#!/usr/bin/env bash
array_param() {
local opt OPTIND tmp
local -a arr_s arr_t
while getopts 's:t:' opt; do
case $opt in
s) tmp=$OPTARG[@]; arr_s=("${!tmp}") ;;
t) tmp=$OPTARG[@]; arr_t=("${!tmp}") ;;
esac
done
echo "arr_s = ${arr_s[*]}"
echo "arr_t = ${arr_t[*]}"
}
arr1=(100 200 300)
arr2=(0 10 3585)
array_param -s arr1 -t arr2
:您应该本地化所有变量,甚至localopt
opt
:创建此格式的临时变量:tmp=$OPTARG[@]
array\u name[@]
:数组分配arr=(值)
:。它首先扩展到${!tmp}
的值,然后再次扩展到最终结果:$tmp
${!tmp}->${array\u name[@]}->所有值
您还可以使用(使代码更可读,但需要
bash
4.3或更高版本):
您不能将
array\u s
和array\u t
作为数组传递,getopts
将只获取每个数组的第一个元素
但是,您可以尝试使用C-stylefor
这样的循环来增加本地ARRAY\s
和ARRAY\t
变量,最后打印它们:
$ cat optarg.sh
#!/usr/bin/env bash
function array_param
{
local OPTIND
while getopts 's:t:' opt ; do
case "$opt" in
s) ARRAY_s+=("${OPTARG}");;
t) ARRAY_t+=("${OPTARG}");;
esac
done
shift $((OPTIND-1))
}
array_s=(100 200 300)
array_t=(0 10 3585)
#Works if only array_s length equal array_t length.
for ((args=0; args<${#array_s[@]}; args++))
do
array_param -s ${array_s[args]} -t ${array_t[args]}
done
echo "ARRAY_s=${ARRAY_s[@]}; ARRAY_t=${ARRAY_t[@]}"
稍微修改函数(变量使用小写,数组语义) 可以称为
array_param "${array_s[@]/#/-s}" "${array_t[@]/#/-t}"
表示法对于bash是特定的,${array_s[@]/#/-s}
匹配字符串的开头,并为数组中的每个元素替换为#
-s
printf "<%s> " "${array_s[@]/#/-s}" "${array_t[@]/#/-t}"
printf”““${array_s[@]/#/-s}”“${array_t[@]/#/-t}”
也比较
printf "<%s> " "${array_s}"
printf "<%s> " "${array_s[@]}"
printf "<%s> " "${array_s[*]}"
printf”““${array\u s}”
printf“${array_s[@]}”
printf“”“${array_s[*]}”
${array\u s}
是数组的第一个元素。请尝试“${array_s[@]}”
array_s=$OPTARG
也只是字符串赋值,而不是数组赋值。你到底想做什么?将参数后面的数组复制到ARRAY\u s
和ARRAY\u t
?是的,我尝试将-s和-t参数分配给一个变量并在函数中使用它(我只插入了一个无法求解的片段)。您缺少引号“$OPTARG”
。否则,/#/-s
..+1的有趣用法。@PesaThe,true,已修复
array_param "${array_s[@]/#/-s}" "${array_t[@]/#/-t}"
printf "<%s> " "${array_s[@]/#/-s}" "${array_t[@]/#/-t}"
printf "<%s> " "${array_s}"
printf "<%s> " "${array_s[@]}"
printf "<%s> " "${array_s[*]}"