1

引数のリストを指定して、bash スクリプトを使用して次のような文字列を生成しようとしています。

 - arg_1
 - arg_2
 - arg_3
 - arg_4

そして、これを実行しようとしている私のスクリプトは次のとおりです。

seeds=
for i in $*; do
  seeds=`printf "$seeds    - $i\n"`
done;
echo "$seeds"

ただし、 inputarg_1 arg_2 arg_3 arg_4で実行すると、上記のスクリプトは次の出力を生成します。これは、スペースと改行文字を明らかに無視します。

- arg_1 - arg_2 - arg_3 - arg_4

スクリプトで何が間違っていたかを知ることができますか? またはこれを行うためのより良い方法はありますか?

4

3 に答える 3

4

シェルでは引用符と空白が非常に重要です。

#!/usr/bin/env bash

for arg in "$@"; do
    seed="$seed    - $arg\n"
done
echo -ne "$seed"

デモ:

$ ./script.sh arg_1 arg_2 arg_3 arg_4
    - arg_1
    - arg_2
    - arg_3
    - arg_4
于 2013-08-02T20:02:31.217 に答える
3

sudo_O が言うように (そしてShellCheckが指摘したように)、最小限の修正で"$@"はなく使用する必要があります。$*

あなたはそれを行うためのより良い方法があるかどうか尋ねましたが、間違いなくあります. フォーマット文字列を満たすために必要以上の引数を指定すると、必要に応じprintfて出力が繰り返されます。これにより、次のように簡単に記述できます。

printf "- %s\n" "$@" 
于 2013-08-02T20:28:33.120 に答える
1

あなたのスクリプトは複雑すぎると思います。ここでコマンド置換は必要ないと思います。これを試してみませんか

seeds=
for i in $*; do
  seeds="$seeds\n- $i"
done;
echo -e ${seeds#\\n}
于 2013-08-02T20:00:36.697 に答える