如何将命令行参数转换为bash脚本数组?
我想接受这个:
./something.sh arg1 arg2 arg3
并将其转换为
myArray=( arg1 arg2 arg3 )
这样我就可以使用myArray在脚本中进一步使用。
此前的SO帖子已接近,但未涉及如何创建数组:How do I parse command line arguments in Bash?
我需要将参数转换为常规的bash脚本数组;我意识到我可以使用其他语言(例如Python),但需要在bash中执行此操作。我想我正在寻找一个“附加”功能或类似的东西?
更新:我还想问一下如何检查零参数并分配一个默认数组值,并且由于下面的答案,能够实现这一点:
if [ "$#" -eq 0 ]; then
myArray=( defaultarg1 defaultarg2 )
else
myArray=( "$@" )
fi
答案 0 :(得分:163)
实际上你的命令行参数几乎就像数组一样。至少,您可以将$@
变量视为数组。也就是说,你可以把它转换成一个像这样的实际数组:
myArray=( "$@" )
如果您只想输入一些参数并将其输入$@
值,请使用set
:
$ set -- apple banana "kiwi fruit"
$ echo "$#"
3
$ echo "$@"
apple banana kiwi fruit
了解如何使用参数结构在POSIX sh中特别有用,它没有其他类似数组。
答案 1 :(得分:48)
也许这会有所帮助:
myArray=("$@")
你也可以通过省略'in'迭代参数:
for arg; do
echo "$arg"
done
将是等效的
for arg in "${myArray[@]}"; do
echo "$arg"
done
答案 2 :(得分:14)
实际上可以使用$1 $2 ...
等访问参数列表
这完全等同于:
${!i}
因此,可以使用set更改参数列表,并且${!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
答案 3 :(得分:4)
这是另一种用法:
#!/bin/bash
array=( "$@" )
arraylength=${#array[@]}
for (( i=1; i<${arraylength}+1; i++ ));
do
echo "${array[$i-1]}"
done
答案 4 :(得分:4)
更简单但是,您可以直接在$@
;)
以下是如何直接从提示符传递args列表:
function echoarg { for stuff in "$@" ; do echo $stuff ; done ; }
echoarg Hey Ho Lets Go
Hey
Ho
Lets
Go
答案 5 :(得分:1)
关于数组和$ @几乎相同的并排视图。
代码:
#!/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
答案 6 :(得分:0)
双引号的重要性值得强调。假设参数包含空格。
代码:
#!/bin/bash
printf 'arguments:%s\n' "$@"
declare -a arrayGOOD=( "$@" )
declare -a arrayBAAD=( $@ )
printf '\n%s:\n' arrayGOOD
declare -p arrayGOOD
arrayGOODlength=${#arrayGOOD[@]}
for (( i=1; i<${arrayGOODlength}+1; i++ ));
do
echo "${arrayGOOD[$i-1]}"
done
printf '\n%s:\n' arrayBAAD
declare -p arrayBAAD
arrayBAADlength=${#arrayBAAD[@]}
for (( i=1; i<${arrayBAADlength}+1; i++ ));
do
echo "${arrayBAAD[$i-1]}"
done
输出:
> ./bash-array-practice.sh 'The dog ate the "flea" -- and ' the mouse.
arguments:The dog ate the "flea" -- and
arguments:the
arguments:mouse.
arrayGOOD:
declare -a arrayGOOD='([0]="The dog ate the \"flea\" -- and " [1]="the" [2]="mouse.")'
The dog ate the "flea" -- and
the
mouse.
arrayBAAD:
declare -a arrayBAAD='([0]="The" [1]="dog" [2]="ate" [3]="the" [4]="\"flea\"" [5]="--" [6]="and" [7]="the" [8]="mouse.")'
The
dog
ate
the
"flea"
--
and
the
mouse.
>