在bash脚本中连接input

我想连接所有parameter passing给我的bash脚本,除了国旗。

所以例如,如果脚本input如下:

./myBashScript.sh -flag1 exampleString1 exampleString2 

我想要的结果是“exampleString1_exampleString2”

我可以做这个预定义数量的input(即2),但我怎么能做到这一点的任意数量的投入?

Solutions Collecting From Web of "在bash脚本中连接input"

 function concatenate_args { string="" for a in "$@" # Loop over arguments do if [[ "${a:0:1}" != "-" ]] # Ignore flags (first character is -) then if [[ "$string" != "" ]] then string+="_" # Delimeter fi string+="$a" fi done echo "$string" } # Usage: args="$(concatenate_args "$@")" 

这是我真正引以为傲的一段代码(我认为这是非常酷的)

 #!/bin/sh firsttime=yes for i in "$@" do test "$firsttime" && set -- && unset firsttime test "${i%%-*}" && set -- "$@" "$i" done IFS=_ ; echo "$*" 

我已经解释了你的问题,以删除所有-

如果你只想删除参数beginnnig的开始序列-

 #!/bin/sh while ! test "${1%%-*}" do shift done IFS=_ ; echo "$*" 

如果你只是想删除第一个参数:

 #!/bin/sh shift IFS=_ ; printf %s\\n "$*" 

这是一个丑陋但简单的解决方案:

 echo $* | sed -e "s/ /_/g;s/[^_]*_//" 

您也可以使用格式化的字符串连接参数。

 # assuming flag is first arg and optional flag=$1 [[ $1 = ${1#-} ]] && unset $flag || shift concat=$(printf '%s_' ${@}) echo ${concat%_} # to remove the trailing _ 

的nJoy!

 flag="$1" shift oldIFS="$IFS" IFS="_" the_rest="$*" IFS="$oldIFS" 

在这种情况下, "$*"正是你所期待的。 很少有正确的选择,但这是一个真正的选择。

或者,简单地循环和连接:

 flag="$1" shift the_rest="" pad="" for arg in "$@" do the_rest="${the_rest}${pad}${arg}" pad="_" done 

$pad变量可以确保在$the_rest的开始处不会出现流浪的下划线。

 #!/bin/bash paramCat () { for s in "$@" do case $s in -*) ;; *) echo -n _${s} ;; esac done } catted="$(paramCat "$@")" echo ${catted/_/}