在bash脚本中连接输入

时间:2012-02-20 00:38:06

标签: linux bash shell unix

我想连接传递给我的bash脚本的所有参数,除了标志。

因此,例如,如果脚本按如下方式获取输入:

./myBashScript.sh -flag1 exampleString1 exampleString2

我希望结果为“exampleString1_exampleString2”

我可以为预定义数量的输入(即2)执行此操作,但如何为任意数量的输入执行此操作?

6 个答案:

答案 0 :(得分:9)

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 "$@")"

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

这是我真正感到自豪的一段代码(我觉得它非常贝壳式)

#!/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 "$*"

答案 3 :(得分:2)

您还可以使用格式化字符串来连接args。

# assuming flag is first arg and optional
flag=$1
[[ $1 = ${1#-} ]] && unset $flag || shift

concat=$(printf '%s_' ${@})
echo ${concat%_} # to remove the trailing _

的nJoy!

答案 4 :(得分:0)

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的开头不会出现迷路下划线。

答案 5 :(得分:0)

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

catted="$(paramCat "$@")"
echo ${catted/_/}