私は次の非常に基本的なコマンド置換スクリプトを書いています。
#!/bin/bash
files=$(ls *.fastq);
echo $files
ディレクトリには複数の.fastqファイルが含まれており、echoコマンドを使用してそのファイルを出力したいと思います。
上記のスクリプトは、各 fastq ファイル名の間にスペースを含む fastq ファイルを出力します。
このように使ってみると
#!/bin/bash
files=$(ls *.fastq);
echo "$files"
結果を新しい行に印刷します。
なぜですか?これはコマンドの置き換えに関連していますか?
ありがとう
答え1
ls
別の行に配置したので、改行があります。シェルは引用符なしでスペースで区切られた各テキストを別々の引数としてコマンドに渡すため、改行は引用符なしで消えます。
注:コマンドの置き換えはシェルによって行われます。仕方ないls
したがって、必要はありませんls
。
したがって、あなたはできます
#!/bin/bash
echo *.fastq
または
#!/bin/bash
files="*.fastq"
echo "$files"
答え2
変数を参照するときは、通常、名前を二重引用符で囲むことをお勧めします。これにより$
、`
(バックティック)および\
(エスケープ)を除いて、引用符付き文字列のすべての特殊文字が再解釈されるのを防ぎます。二重引用符の中に特殊文字を残すと、引用符で$
囲まれた変数 ("$variable") を引用できます。つまり、変数をその値に置き換えることができます。
単語の区切りを防ぐには、二重引用符を使用してください。二重引用符で囲まれた引数は、スペース区切り文字が含まれていても、それ自体を単一の単語としてレンダリングします。
例えば
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"
単語分割やスペースの保存が問題になる場合にのみ、echoステートメントのパラメータを二重引用符で囲む必要があります。
詳細と例については、次をご覧ください。ここ
答え3
引用符なしで変数を引用すると(たとえば、echo $files
)シェルは値をスペースに分割し、各用語を別々のコマンドラインオプションに渡します。改行は他のスペースと同じように扱われます。プログラムはecho
改行文字をまったく見ていません。文字列の配列を取得するだけで、各文字列はファイル名です。
引用符の中に変数を引用すると(たとえば、echo "$files"
)シェルは、スペース分割を実行せずに、変更されていない値全体を次のように渡します。一つ議論。プログラムecho
は改行文字を含む長い文字列を受け取ります。
変数を除いて、これはリテラル値を引用符で囲むのと同じ動作です。を書くと、echo foo bar
シェルはスペースを削除し、echo
文字列sumだけを取得しfoo
、bar
複数の引数を組み合わせてエンコードする方法なので、文字列の間にスペースを含む文字列を印刷します。echo "foo bar"
を書くと、echo
単一の文字列を取得してfoo bar
そのまま印刷します。