我有一个脚本,我需要传递一个字符串,其中包含变量和文本以符合URI。
这方面的一个例子是:
URI="${PROTO}://${USER}:${PASS}@${HOST}/${TARGET}"
我定义变量${PROTO}
时未定义变量${USER}
,${PASS}
,${HOST}
,${TARGET}
和$URI
但它们将会定义当要执行Bash脚本时,我需要将URI扩展为字符串的最终形式。
我该怎么做?我已经阅读了eval: When You Need Another Chance但我真的不喜欢使用eval,因为它可能是危险的,而且它意味着要逃避URI字符串的很多部分。
还有其他办法吗?该问题的推荐解决方案是什么?
由于 中号
答案 0 :(得分:3)
变量存储数据;如果你没有PROTO
等人的价值观。然而,你没有数据。你需要一个模板。
uri_template="%s://%s:%s@%s/%s"
稍后,当做包含其余数据时,您可以将它们插入到模板中。
uri=$(printf "$uri_template" "$PROTO" "$USER" "$PASS" "$HOST" "$TARGET")
(在bash
中,您可以使用-v
选项printf -v uri "$uri_template" "$PROTO" "$USER" "$PASS" "$HOST" "$TARGET"
来避免使用命令替换fork。)
您还可以定义一个功能:
uri () {
# I'm being lazy and assuming uri will be called with the correct 5 arguments
printf "%s://%s:%s@%s/%s" "$@"
}
# Variables and functions exist in separate namespaces, so the following works
uri=$(uri "$PROMPT" "$USER" "$PASS" "$HOST" "$TARGET")
答案 1 :(得分:3)
在执行脚本之前,使用' export'。
定义变量export PROTO='http'
export USER='bob'
export PASS='password'
export HOST='myhostname'
export TARGET='index.html'
bash ./myscript_with_uri.sh
OR
创建URI脚本作为将返回URI的过程。
uri_creater.sh
makeUri ()
{
URI="${PROTO}://${USER}:${PASS}@${HOST}/${TARGET}
}
script_using_uri.sh
. uri_creater.sh
PROTO='http'
USER='bob'
PASS='password'
HOST='myhostname'
TARGET='index.html'
makeUri
url="${URI}"
echo "${url}"
使用bash在Centos 6.5上测试。