2013-07-23 4 views

答えて

5

printfを使用できます。

% printf 'str1%s\t' 'str2' 'str3' 'str4' 
str1str2 str1str3 str1str4 
3

方法がないようです。おそらく関数内でこれらの名前を生成するためにループを使用する必要があります。あるいは、変数を使用して共通部分を置き換えることもできますし、誤植を防ぐために "set -u"を使うこともできます。

パフォーマンス上の理由から、ダッシュを使用することをお勧めしますが、意思決定を実証するための数字は提供していないようです。実際のパフォーマンスの差を測定して再評価することをお勧めします。早すぎる最適化のために落ちているかもしれません。 Bashと可能なパフォーマンスの低下を使用して、どれだけの実装時間とデバッグ時間を節約するかを検討してください。

+0

私はそれが本当に時期尚早の最適化だと思う、私は多くのシェルスクリプトを書いていないため、私は確信していなかった。私は彼らが何も複雑ではないことが分かるので、違いはbashの起動時間だけになります... – greg0ire

+0

@ greg0ire、はい、主に起動時ですが、多くのスクリプト呼び出しが必要な場合や、あなたのコード内のサブシェル。パフォーマンスが重要な場合は、一般的なシナリオで測定してください。 – spbnick

+0

時間が私に違いを与える:bash = 5ms、sh = 3ms。私はそれが受け入れられると思う。 – greg0ire

0

私は本当に@mikeservによって提供さprintfソリューションを好むが、私はループを使用した例を提供しようと思いました。

以下は、両方の文字列を同じコマンドにargsとして提供するのではなく、展開された文字列ごとに1つのコマンドを実行する場合に最も役立ちます。

for X in composer sismo; do 
    echo "php/$X"     # replace 'echo' with your command 
done 

ただし、$ARGSは、上記のコマンドでは引用符で囲まれていないであることを

ARGS="$(for X in composer sismo; do echo "php/$X"; done)" 
echo $ARGS       # replace 'echo' with your command 

注意としてそれを書き換えて、これはその内容がwordsplittedされることを意味していることを認識することができた(すなわち任意の元の文字列の場合スペースを入れると、それは壊れます)。

関連する問題