$記号を使用して変数値を取得できることを知っています。
x=3
echo $x
3
$記号を使用せずに値を取得するために使用できる他の方法はありますか?
$記号が特殊文字であり、これを実行しようとするとエラーが発生するため、このように尋ねますsed
。sed: -e expression #1, char 31: unterminated s' command
A=25 #lineNumber
destStr="192.168.1.3 192.168.1.4"
sed ""$A"s/Allow from .*/Allow from $destStr/" -i test2
destStr
エスケープ文字を使用すると(値の代わりに)文字列が印刷されます\
。
sed ""$A"s/Allow from .*/Allow from \$destStr/" -i test2
echo
代わりに使用してくださいsed
:
25s/Allow from .*/Allow from 192.168.1.3
192.168.1.4
/ -i test2
ベストアンサー1
最終編集でわかるように、問題はドル記号とは関係ありませんが、その内容が原因で発生しますdeststr
。これは192.168.1.3 192.168.1.4
2行に過ぎず、1つだけを含み、もう1192.168.1.3
行は192.168.1.4
改行文字で終わる2行です。つまり、変数置換後の実際のコマンドは次のようになります。
sed "25s/Allow from .*/Allow from 192.168.1.3
192.168.1.4
/" -i test2
コマンドラインがsed
1行ずつ解釈されるので、解釈したい最初のコマンドは次のようになります。
25s/Allow from .*/Allow from 192.168.1.3
これは明らかに終了していないs
注文なので、sed
そのように報告されます。
これで見つかったソリューションはecho
次のように動作します。
echo $var
エコに電話をかける二つ引数(スペースが引用されていないため、引数区切り文字として解釈されます)、最初のものは、192.168.1.3
2番目は192.168.1.4
両方ともシェルで解釈されなくなった形式です。
echo
スペースで区切られた(オプションではない)引数のみが出力されるため、コマンドラインが表示されます。
sed "25s/Allow from .*/Allow from 192.168.1.3 192.168.1.4/" -i test2
予想通り。
$()
ただし、コマンドの置き換えの場合、バックティックはエラーが発生しやすいため、可能な限りバックティックを使用する必要があります。したがって、以下はあなたの要件を満たしています。
sed "$A s/Allow from .*/Allow from $(echo $destStr)/" -i test2
引用を簡単にするために、アドレスとコマンドの間にスペースが許可されているという事実も利用しましたsed
。これらの追加の空白が不可能な場合は、次の構文を使用することもできます。
sed "${A}s/Allow from .*/Allow from $(echo $destStr)/" -i test2
destStr
これは、空白以外の文字がシェルまたはsed
代替文字列に現れる文字によって解釈されないという事実に依存することに注意してください。