我想连接传递给我的bash脚本的所有参数,除了标志。
因此,例如,如果脚本按如下方式获取输入:
./myBashScript.sh -flag1 exampleString1 exampleString2
我希望结果为“exampleString1_exampleString2”
我可以为预定义数量的输入(即2)执行此操作,但如何为任意数量的输入执行此操作?
答案 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/_/}