コンソール出力で先頭の空白がスクリプトで省略されるのはなぜですか?


10

次のスクリプトがあります。

#!/bin/bash
function consoleWriteLine() {
  echo $* >&2
}

consoleWriteLine "    indented by 4 spaces"

実行すると、次の出力が得られます。

$ ./test.sh
indented by 4 spaces

私の4つのスペースはどこに行きましたか?そして、どうすればそれらを取り戻すことができますか?

回答:


22

echo関数で引用するだけです:

function consoleWriteLine() {
  echo "$*" >&2
}

echoスペースで区切られた複数の引数に気づき、それらを1 つのスペースで区切って出力します。見る:

$ echo a b c
a b c
$ echo a b             c
a b c
$ echo "a b             c"
a b             c

最後の例では文字列がa b cある1つの引数とechoそのまま編。


ここで私が理解する鍵は、引数を最初に引用すると、それがに渡されるまで空白のみを保持することconsoleWriteLineでした。2回目にはecho、空白を追加の引用符で再度保持する必要があります。私はあなたが引用符を置くことができるとは決して思っていませんでした$*
Der Hochstapler、2015年

4
だけでなく、あなたの周りに引用符を置くことができ$*、変異体は$@、具体的に展開するために作成された別の言葉引用されたときに:"$@"いくつかの引数することができ、"$*"常に一つだけです。echo違いのない数少ないコマンドの1つです。
アレクシス

4

私自身もこの問題を抱えていましたが、

このブログのとおり、デフォルトでは空白が含まれているためIFSを変更する必要があるため、「xxx yyy zzzz」は、間に空白がある3つの文字列として表示されます。

IFS='\n'

コマンドの前に修正し、IFSの設定を解除して変更を削除します

unset IFS


2
これは機能しますが、受け入れられた解決策(引用符の追加)はかなりすっきりしています。
シーザーソル

うなずく、引用されていないことに気づかなかった。おっと!:D
djsmiley2kStaysInside
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.