我不经常使用Bash但我需要处理一些Bash,它必须向一个Web服务发出一个curl请求,其中一个查询字符串尾部是由脚本命令参数变量中包含的命令参数构建的$@
。因此,如果命令参数字符串类似于-e something -v -s somethingelse
,则必须生成的查询字符串为e=something&v=blank&s=somethingelse
。
目前我的测试脚本如下所示:
#!/bin/bash
set -e
echo "${@}"
query_string=""
for arg in "${@}" ; do
if [[ "${arg}" =~ "-" ]] ; then
query_string+="${arg}="
else
if [ -z "${arg}" ] ; then
query_string+="blank&"
else
query_string+="${arg}&"
fi
fi
done
echo "${query_string}" | tr -d '-'
并产生错误的输出
e=something&v=s=somethingelse&
我不知道我哪里出错了。任何建议将不胜感激。
答案 0 :(得分:1)
怎么样:
#!/bin/bash
set -e
echo "${@}"
option=true
query_string=""
for arg in "${@}" ; do
if $option ; then
query_string+="${arg}="
option=false
else
if [[ "${arg}" =~ "-" ]] ; then
query_string+="blank&${arg}="
else
query_string+="${arg}&"
option=true
fi
fi
done
echo "${query_string::-1}" | tr -d '-'
答案 1 :(得分:1)
每次迭代都要检查前一个arg,看它是否是一个开关,而不是一个值:
#!/bin/bash
set -e
echo "${@}"
prev_arg=""
query_string=""
for arg in "${@}" ; do
if [[ $arg == -* ]] ; then
# Current arg is a switch and the previous one was also a switch
# which means the value for it is blank
if [[ $prev_arg == -* ]] ; then
query_string+="blank&"
fi
query_string+="${arg}="
else
query_string+="${arg}&"
fi
prev_arg="$arg"
done
echo "${query_string::-1}" | tr -d '-'
这会产生以下输出:
something -v -s somethingelse
e=something&v=blank&s=somethingelse