2012-02-20 11 views
3

フラグ以外のbashスクリプトに渡されたすべての引数を連結したいと思います。bashスクリプトの入力を連結します

次のようにスクリプトが入力を取るのであれば、たとえば、:

./myBashScript.sh -flag1 exampleString1 exampleString2 

私は結果が「exampleString1_exampleString2」になりたい

を私は入力の事前に定義された数のためにこれを行うことができますが(つまり、2)しかし、入力の任意の数のために私はどのようにそれを行うことができますか?

答えて

2

これは醜いが、シンプルなソリューションです。このような状況において

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

と間違っています。あなたはその質問を読んだことがありますか? –

+0

@JoSo:はい、これは(あまりにも言葉が詰まった)仕様に該当します。 – mvds

+0

スペックを解釈しても、あなたの解決策は間違っています。引数を削除することさえできません。 –

8
function concatenate_args 
{ 
    string="" 
    for a in "[email protected]" # 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 "[email protected]")" 
+0

厳しいですが、-1悪いシェルスタイル(非常に冗長で、 '[[...]]'は移植性がありません)。代わりに 'test'を使い、' $ {a:0:1} 'を使う代わりに私の解決策を見てください。 –

+0

@JoSoなぜ[[]]'は移植できませんか? – Tyilo

+0

これはPOSIX shではなくbashです。 ( '$ {a:0:1}'と同じです)。ほとんどのシステムにbashがインストールされているので気にしない人もいますが、実際には使用できません(代わりに 'test'エイリアス' [...] 'を使います)。 –

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

"$*"は、あなたが探している正確に何で、それはそうです。これは正しい選択であることはめったにありませんが、実際に正しい選択である場合があります。

また、単にループとCONCATENATE:

flag="$1" 
shift 
the_rest="" 
pad="" 
for arg in "[email protected]" 
do 
    the_rest="${the_rest}${pad}${arg}" 
    pad="_" 
done 

$pad変数を使用すると、$the_restの開始時に浮遊アンダースコアで終わるしないことを保証します。

+0

O.P.は各argの間にどのように '_'を入れますか? – shellter

+1

IFSを設定して、最初の文字に '_ * 'が含まれているため、' $ * '連結の動作に影響を与えることができます。 –

2

ここ-で始まるすべての引数を除去するように、私はあなたの質問を解釈してきた私は、実際の誇りに思っているコードの部分(それは私が考える非常にシェル形式である)

#!/bin/sh 

firsttime=yes 
for i in "[email protected]" 
do 
    test "$firsttime" && set -- && unset firsttime 
    test "${i%%-*}" && set -- "[email protected]" "$i" 
done 

IFS=_ ; echo "$*" 

です

あなただけ-でbeginnnig引数の開始シーケンスを削除する場合:

#!/bin/sh 

while ! test "${1%%-*}" 
do 
    shift 
done 

IFS=_ ; echo "$*" 

あなたは、単に最初の引数削除する場合:また、引数を連結するためにフォーマットされた文字列を使用することができます

#!/bin/sh 

shift 
IFS=_ ; printf %s\\n "$*" 
1

を。

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

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

nJoy!

関連する問題