コマンド置換の非常に基本的なスクリプトを以下に記述しました。
#!/bin/bash files=$(ls *.fastq); echo $files
ディレクトリには多数の.fastqファイルが含まれており、echoコマンドを使用してそれらを出力したいだけです
上記のsriptは、各fastqファイル名の間にスペースを入れてfastqファイルを出力します。
このように使用すると
#!/bin/bash files=$(ls *.fastq); echo "$files"
結果が新しい行に出力されます。
なぜそうなのですか?コマンド置換と関係がありますか?
ありがとう
回答
変数を参照するときは、通常、名前を二重引用符で囲むことをお勧めします。これにより、引用符で囲まれた文字列内のすべての特殊文字が再解釈されるのを防ぎます。ただし、$
、`
(逆引用符)、および(エスケープ)。 $
を二重引用符で囲む特殊文字として保持すると、引用符で囲まれた変数( “$ variable”)を参照できます。つまり、変数をその値に置き換えることができます。
使用単語の分割を防ぐための二重引用符。二重引用符で囲まれた引数は、空白の区切り文字が含まれている場合でも、1つの単語として表示されます。
eg
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"
エコーステートメントの引数を二重引用符で囲む必要があるのは、単語の分割や空白の保持が問題になる場合のみです。
詳細と例については、こちら
回答
ls
は改行を別々の行に配置するため、改行があります。シェル(bash)は、引用符で囲まれていないスペースで区切られた各テキストを個別の引数としてコマンドに渡すため、改行は引用符なしで消えます。
注:コマンド置換はシェルによって行われます。 ls
なので、は必要ありません。
したがって、
#!/bin/bash echo *.fastq
または
#!/bin/bash files="*.fastq" echo "$files"
コメント
ttyを使用する場合、およびそうでない場合はls -1
を使用します。したがって、ls -x
を使用して必要なものを取得します。
回答
変数を引用符で囲まずに参照すると(echo $files
など)、シェルは値を空白で分割し、各用語を個別のコマンドラインオプションとして渡します。改行は他の空白と同じように扱われます。 echo
プログラムは、改行文字をまったく認識しません。文字列の配列を取得するだけで、それぞれが単一のファイル名です。
参照する場合引用符で囲まれた変数(例:echo "$files"
)に対して、シェルは空白の分割を行いません。代わりに、値全体を変更せずに単一引数として渡します。 echo
プログラムは、改行文字を含む1つの長い文字列を受け取ります。
変数は別として、これはリテラル値を引用符で囲んだ場合と同じ動作です。 echo foo bar
と書くと、スペースはシェルによって削除され、echo
は文字列foo
とbar
を指定すると、複数の引数を組み合わせるようにコーディングされているため、これらの文字列を1つのスペースで出力します。
、echo
は単一の文字列foo bar
を取得し、そのまま出力します。
ls
は<と同じように出力されますdiv id = "92c3b12d79">