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

Bash-通过解析脚本命令参数构建URL查询字符串,bash,Bash,我不经常使用Bash,但我需要使用一点Bash,它必须向web服务发出curl请求,并使用一个查询字符串尾部,该查询字符串尾部是根据script command arguments变量$@中包含的命令参数构建的。因此,如果命令参数字符串类似于-e something-v-s somethingelse,那么必须生成的查询字符串是e=something&v=blank&s=somethingelse 目前,我的测试脚本如下所示: #!/bin/bash set -e echo "${@}"

我不经常使用Bash,但我需要使用一点Bash,它必须向web服务发出curl请求,并使用一个查询字符串尾部,该查询字符串尾部是根据script command arguments变量
$@
中包含的命令参数构建的。因此,如果命令参数字符串类似于
-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&
我不确定我错在哪里。如有任何建议,我们将不胜感激。

如何:

#!/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 '-'

每次迭代都必须检查前一个参数,以查看它是否是一个开关,而不是一个值:

#!/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

这是我在我的中遗漏的:)记住前面的arg/opt。