bash - 在 bash 脚本中将 getopts 与关联数组结合使用
bash - using getopts with an associative array in a bash script
我在下面的代码中使用 getopts
和 associate array
。
我不知道如何正确调用我的值,因为我要求使用相同标志的 (2) 个别名。
这是我目前的情况:
#!/bin/bash
set -e
usage () {
echo "Usage: [=12=] -c alias1 -c alias2"
}
while getopts ":c:" opt; do
case $opt in
c) alias="$OPTARG";;
*) echo "Error unknown option -$OPTARG"
usage
exit 1
;;
esac
done
# Testing use off array
declare -A alias=( [alias1]=myhost-01.com \
[alias2]=myhost-02.com \
[alias3]=myhost-03.com \
[alias4]=myhost-04.com )
echo "This is my source host:${alias}"
echo "This is my target host:${alias}"
这是我想要执行它的方式(或更好的建议方式):
-bash-4.1$ ./test-array2.sh -c alias1 -c alias4
This is my source host:
This is my target host:
显然,我没有得到预期的结果:
This is my source host: myhost-01.com
This is my target host: myhost-04.com
我该怎么做?我想传入 (2) 个别名,它使用我的别名映射(关联数组)来获取正确的键值对,或者我的方法可能是错误的,我不能使用 -c
两次?谢谢。
您可以使用数组来存储别名,例如
aliases=()
while getopts ":c:" opt; do
case $opt in
c) aliases+=( "$OPTARG" );;
# ...
esac
done
然后你使用这个数组来索引你的关联数组:
echo "This is my source host:${alias_to_host[${aliases[0]}]}"
echo "This is my target host:${alias_to_host[${aliases[1]}]}"
但是,如果输入选项表示源主机和目标主机的别名,并且总是恰好有两个主机,那么使用单独的选项(例如 -s
和 -d
)会更简洁,并且将这些变量分开而不是重新使用开关 -c
:
# ...
case $opt in
s) source=$OPTARG;;
d) destination=$OPTARG;;
# ...
esac
# ...
echo "This is my source host:${alias_to_host[$source]}"
echo "This is my target host:${alias_to_host[$destination]}"
我在下面的代码中使用 getopts
和 associate array
。
我不知道如何正确调用我的值,因为我要求使用相同标志的 (2) 个别名。
这是我目前的情况:
#!/bin/bash
set -e
usage () {
echo "Usage: [=12=] -c alias1 -c alias2"
}
while getopts ":c:" opt; do
case $opt in
c) alias="$OPTARG";;
*) echo "Error unknown option -$OPTARG"
usage
exit 1
;;
esac
done
# Testing use off array
declare -A alias=( [alias1]=myhost-01.com \
[alias2]=myhost-02.com \
[alias3]=myhost-03.com \
[alias4]=myhost-04.com )
echo "This is my source host:${alias}"
echo "This is my target host:${alias}"
这是我想要执行它的方式(或更好的建议方式):
-bash-4.1$ ./test-array2.sh -c alias1 -c alias4
This is my source host:
This is my target host:
显然,我没有得到预期的结果:
This is my source host: myhost-01.com
This is my target host: myhost-04.com
我该怎么做?我想传入 (2) 个别名,它使用我的别名映射(关联数组)来获取正确的键值对,或者我的方法可能是错误的,我不能使用 -c
两次?谢谢。
您可以使用数组来存储别名,例如
aliases=()
while getopts ":c:" opt; do
case $opt in
c) aliases+=( "$OPTARG" );;
# ...
esac
done
然后你使用这个数组来索引你的关联数组:
echo "This is my source host:${alias_to_host[${aliases[0]}]}"
echo "This is my target host:${alias_to_host[${aliases[1]}]}"
但是,如果输入选项表示源主机和目标主机的别名,并且总是恰好有两个主机,那么使用单独的选项(例如 -s
和 -d
)会更简洁,并且将这些变量分开而不是重新使用开关 -c
:
# ...
case $opt in
s) source=$OPTARG;;
d) destination=$OPTARG;;
# ...
esac
# ...
echo "This is my source host:${alias_to_host[$source]}"
echo "This is my target host:${alias_to_host[$destination]}"