Bashスクリプトの一重引用符

Bashスクリプトの一重引用符

私のコマンド構文は次のとおりです。

command 'variable'

変数は一重引用符で渡す必要があります。

入力ファイルで for ループを使用する場合

variable1
variable2
variable3

for i in `cat $1`
do
       command '$i'
done

shell>file.sh input

bashは入力を変数として受け入れないので、一重引用符は不完全です。変数をそのままにするために単一引用符を使用する方法を提案します。

答え1

一重引用符で囲まれた内容は、入力したとおりに正確に渡されます。したがって、command '$i'2 文字の合計で構成される文字列がコマンドに渡されます。$i

使用された変数の値を取得するには、二重引用符を使用する必要があります。

for i in `cat $1`
do
       command "$i"
done

あるいは、コード内のファイルの1行に1つの単語が必要なので、ループ全体を次の行に置き換えます。

xargs -n1 -r command <"$1"

答え2

必要に応じてこれを行うことができます。

while read i
do
       command "'$i'"
done < "$1"

答え3

commandファイルの各行(パスが保存されている)を呼び出し、その行$1の内容をそのまま単一の引数として渡すには、command次のようにします。

  • GNUの使用xargs:

    xargs -d '\n' -n 1 -r -a "$1" command
    
  • POSIXシェルの使用:

    while IFS= read -r line <&3; do
      command "$line" 3<&-
    done 3< "$1"
    

あなたの

for i in `cat $1`; do
  command '$i'
done

リテラル文字列を渡す際$iの明らかな問題に加えて、いくつかのcommand他の問題があります。

  • 引用符を忘れました$1。これは分割+グローブの影響を受けるという意味です。これは、スペース、タブ、改行文字、またはワイルドカードを含むファイルパスに対して正しく機能しないことを意味します。
  • --オプションの終わりを表示するのを忘れました。catつまり、で始まるファイルパスでは正しく機能しません-。を使用しても機能しないことをお勧めしcat -- "$1"ます-。オプションも受け入れるcat < "$1"場合(または)を使用する必要があります。command--xargs ... command --command -- "$line"
  • これは`cat $1`分割+グローブ演算子を再び呼び出します。したがって、ファイル行を繰り返すのではなく、ファイル内容の分割によって引き起こされる各globパターンに一致するファイルのリストを繰り返します。

答え4

引用符なしでコマンドを使用できます。

for i in `cat $1`
do
       command $i
done

一重引用符を使用すると、'$i'文字通りの意味を知ることができます$i

二重引用符を使用する"$i":から値を取得することはできますが、$i単一の文字列として取得できます(通常は望ましい動作です)。

引用符なし$i:の値に拡張されますが、$i引数は分割されます。したがって、たとえば、-a -b二重引用符でスペースがある場合、通常は-a -b予期しないパラメータがありますが、最後の場合には-a2-bつの異なるパラメータがあります。

引用符を使用しないことは通常セキュリティ上の問題であるため、入力が悪意のないことを確実に知っている場合にのみこれを行う必要があります。

関連情報