如何转换命令行参数为一个bash脚本阵列?
我想借此:
./something.sh arg1 arg2 arg3
并将其转换为
myArray=( arg1 arg2 arg3 )
所以,我可以使用myarray的为脚本中的进一步使用。
这以前SO后接近,但不进入如何创建一个数组: 我如何解析的命令行参数击?
我需要的参数转换为常规bash脚本阵列; 我知道我可以使用其他语言(Python的,例如),但需要为此在bash。 我想我正在寻找一个“追加”功能或类似的东西?
更新:我也想问如何检查零个参数,并指定一个默认的数组值,并且由于下面的答案,能得到这个工作:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
其实你的命令行参数实际上像一个数组了。 至少,你可以把在$@
变量很像一个阵列。 这就是说,你可以将其转换成这样一个实际的数组:
myArray=( "$@" )
如果你只是想输入一些参数并将其送入$@
值,使用set
:
$ set -- apple banana "kiwi fruit"
$ echo "$#"
3
$ echo "$@"
apple banana kiwi fruit
了解如何使用论证结构是POSIX SH,其中有没有别的喜欢的阵列特别有用。
也许这可以帮助:
myArray=("$@")
你也可以通过“在”省略遍历参数:
for arg; do
echo "$arg"
done
将相当于
for arg in "${myArray[@]}"; do
echo "$arg"
done
其实参数列表可以与被访问$1 $2 ...
等等。
这是完全等同于:
${!i}
因此,参数列表可以用一组被改变,
和${!i}
是访问它们的正确方法:
$ set -- aa bb cc dd 55 ff gg hh ii jjj kkk lll
$ for ((i=0;i<=$#;i++)); do echo "$#" "$i" "${!i}"; done
12 1 aa
12 2 bb
12 3 cc
12 4 dd
12 5 55
12 6 ff
12 7 gg
12 8 hh
12 9 ii
12 10 jjj
12 11 kkk
12 12 lll
针对您的特殊情况下,这可以用于(无需阵列),设定的参数列表给出无时:
if [ "$#" -eq 0 ]; then
set -- defaultarg1 defaultarg2
fi
它转换为这种更简单的表达:
[ "$#" == "0" ] && set -- defaultarg1 defaultarg2
这里是另一个用法:
#!/bin/bash
array=( "$@" )
arraylength=${#array[@]}
for (( i=1; i<${arraylength}+1; i++ ));
do
echo "${array[$i-1]}"
done
然而,更方便,您可以直接操作$@
;)
以下是如何直接从提示符下执行args来通AA列表:
function echoarg { for stuff in "$@" ; do echo $stuff ; done ; }
echoarg Hey Ho Lets Go
Hey
Ho
Lets
Go
并排侧视图的阵列和$ @如何实际上是相同的。
码:
#!/bin/bash
echo "Dollar-1 : $1"
echo "Dollar-2 : $2"
echo "Dollar-3 : $3"
echo "Dollar-AT: $@"
echo ""
myArray=( "$@" )
echo "A Val 0: ${myArray[0]}"
echo "A Val 1: ${myArray[1]}"
echo "A Val 2: ${myArray[2]}"
echo "A All Values: ${myArray[@]}"
输入:
./bash-array-practice.sh 1 2 3 4
输出:
Dollar-1 : 1
Dollar-2 : 2
Dollar-3 : 3
Dollar-AT: 1 2 3 4
A Val 0: 1
A Val 1: 2
A Val 2: 3
A All Values: 1 2 3 4