Bash - 通过解析脚本命令参数来构建URL查询字符串

时间:2016-03-17 10:54:06

标签: bash

我不经常使用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&

我不知道我哪里出错了。任何建议将不胜感激。

2 个答案:

答案 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