我希望能够在脚本运行时传递什么环境。就像script.sh dev
($dev
将在脚本中的curl命令中填充适当的URL)。
甚至可以将环境打印为要通过的选项?
#!/bin/bash
# Environment/URL
dev=myurl.myco.com
tst=myurl.myco.com
tst02=myurl.myco.com
tst03=myurl.myco.com
qa01=myurl.myco.com
request=`curl -L -k -H 'Content-Type:application/x-www-form-urlencoded' -H 'cache-control:no-cache' -X https://$tst/bla/bla/bla/bla 2>/dev/null`
答案1
由于您使用的是 Bash,因此您可以使用关联数组(在bash-4.0-alpha
1中介绍)。
您可以定义script
:
#!/bin/bash
declare -A urls
urls[dev]=dev.example.com
urls[tst]=test.example.com
request="$(curl ... https://"${urls["$1"]}"/foo/bar ...)"
并将其调用为:
script dev
第一个位置参数 ( $1
) 将用作从数组中检索 URL 的键urls
。
作为(更用户友好的)变体,如由 DopeGhoti 建议,script
或许:
#!/bin/bash
declare -A urls
urls[dev]=dev.example.com
urls[tst]=test.example.com
select opt in "${!urls[@]}"; do
[ ! -z "$opt" ] && break
done
request="$(curl ... https://"${urls["$opt"]}"/foo/bar ...)"
这意味着被调用为:
script
该select
命令向用户提供为数组定义的键列表urls
,并确保选择有效的键。
最后,作为一种分离关注点的方法,您可以将 URL 存储在纯文本文件中,此处名为urlfile
,格式为:
dev dev.example.com
tst test.example.com
并使用循环将其内容加载到script
的数组中:urls
read
#!/bin/bash
declare -A urls
while read -r label url; do
urls["$label"]="$url"
done <urlfile
select opt in "${!urls[@]}"; do
[ ! -z "$opt" ] && break
done
request="$(curl ... https://"${urls["$opt"]}"/foo/bar ...)"
注意:即使没有必要,我也选择了$(...)
命令替换语法(而不是` `
),因为它是通常更通用。
1有了这个犯罪从 2011 年开始。Bash 4.0+ 现已广泛使用。