Bash 脚本curl 来自命令行的输入变量

Bash 脚本curl 来自命令行的输入变量

我希望能够在脚本运行时传递什么环境。就像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-alpha1中介绍)。

您可以定义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的数组中:urlsread

#!/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+ 现已广泛使用。

相关内容