私はたくさん試しましたが、シェルについては非常に新しいものです。で二重引用符と一重引用符の両方を使用できますかecho
?
システムコールを生成したいが、echo "scan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}"
複数の二重引用符と一重引用符が原因でエラーが発生します。
ftable="echo" " \"" "scan" " " "'LPV',{FILTER => " "\"" "\(" "PrefixFilter ""\(""'MP1-Eq1'" "\)" "\"" "\}" "\" "
echo "scan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}"
bash: syntax error near unexpected token `('
どのように書くべきですかscan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}
?構文はhbase
s で変更できません。
編集する
電話をかけたいエコ以内にシステムコール。
ftable="echo "scan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}" "
system(ftable)
error
$を試しましたが、
ftable="echo $'scan" "\'" "LPV" "\'" ",{FILTER => " "\"" "(PrefixFilter (" "\'" "MP1-Eq1" "\'" ")" "\"" "}' '"
system(ftable)
error
二重引用符でエラーが発生します。
答え1
存在するbash
:
echo $'scan \'LPV\',{FILTER => "(PrefixFilter (\'MP1-Eq1\')"}'
または
echo "scan 'LPV',{FILTER => \"(PrefixFilter ('MP1-Eq1')\"}'"
長い文字列の場合、このオプションはより便利です。
> cat <<EOT
scan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}
EOT
パラメータの拡張と引用符の削除(バックスラッシュ)が意図的かどうかに応じて、またはまたはEOT
です。\EOT
内部用awk
この文字列を内部で定義すると、すべてawk
がより複雑になります。これはawk
シェルの外部で行う必要があります。
ftable=$'echo "scan \'LPV\',{FILTER => "(PrefixFilter (\'MP1-Eq1\')"}"'
# echo "$ftable"
awk -v ftable="$ftable" '... system(ftable); ...'
答え2
二重引用符内の二重引用符をエスケープできます。
$ ftable="echo \"scan 'LPV',{FILTER => \"(PrefixFilter ('MP1-Eq1')\"}\""
$ echo $ftable
echo "scan 'LPV',{FILTER => "(PrefixFilter ('MP1-Eq1')"}"