web-dev-qa-db-ja.com

コマンド置換の内容を含む変数をエコーする

以下に示す非常に基本的なコマンド置換スクリプトを作成しました。

#!/bin/bash
files=$(ls *.fastq);
echo $files

ディレクトリには一連の.fastqファイルが含まれており、echoコマンドを使用してそれらを出力したい

上記のsriptは、各fastqファイル名の間にスペースを入れてfastqファイルを出力します。

このように使うと

#!/bin/bash
files=$(ls *.fastq);
echo "$files"

結果を新しい行に出力します。

なぜそうなのですか?コマンドの置換と関係がありますか?

ありがとう

6
user3138373

変数を参照するときは、通常、その名前を二重引用符で囲むことをお勧めします。これにより、引用符で囲まれた文字列内のすべての特殊文字の再解釈が防止されます($`(逆引用符)、および\(エスケープ)を除く)。 $を二重引用符内の特殊文字として保持すると、引用符付き変数( "$ variable")を参照できます。つまり、変数をその値に置き換えることができます。

単語を分割しないようにするには、二重引用符を使用します。二重引用符で囲まれた引数は、空白区切り文字が含まれている場合でも、1つの単語として表示されます。

例えば.

variable1="a variable containing five words"
COMMAND This is $variable1    # Executes COMMAND with 7 arguments:
# "This" "is" "a" "variable" "containing" "five" "words"

COMMAND "This is $variable1"  # Executes COMMAND with 1 argument:
# "This is a variable containing five words"

エコーステートメントの引数を二重引用符で囲む必要があるのは、Wordの分割または空白の保持が問題である場合のみです

詳細と例については こちら をご覧ください

4
tachomi

lsは改行するため、改行します。シェル(bash)は、引用符で囲まれていないスペースで区切られた各テキストを個別の引数としてコマンドに渡すため、改行は引用符なしで消えます。

注:コマンドの置換はシェルによって行われますlsではないため、lsは必要ありません。

したがって、あなたはできる

#!/bin/bash
echo *.fastq

または

#!/bin/bash
files="*.fastq"
echo "$files"
5
ctrl-alt-delor

引用符なしで変数を参照すると(echo $filesなど)、シェルは空白で値を分割し、各用語を個別のコマンドラインオプションとして渡します。改行は他の空白と同じように扱われます。 echoプログラムは改行文字をまったく認識しません。文字列の配列を取得するだけで、各文字列は単一のファイル名です。

引用符で囲まれた変数を参照する場合(例:echo "$files")、シェルは空白を分割しません。代わりに、値全体を変更せずにsingle引数として渡します。 echoプログラムは、改行文字を含む1つの長い文字列を受け取ります。

変数はさておき、これはリテラル値を引用符で囲む場合と同じ動作です。 echo foo barと書くと、スペースはシェルによって取り除かれ、echoは文字列foobarを取得するだけで、これらの文字列を複数の引数を組み合わせるためにコーディングされているので、それらの間のスペースは1つです。 echo "foo bar"と書くと、echoは単一の文字列foo barを取得し、そのまま出力します。

1
Wyzard