通常、次のように別の行に長いコマンドを入力します。
myapp -a foooooooo1 \
-b foooo2 \
-c foooooooooooooooo3 \
-d foooooooo4 \
bar
しかし、私はそれを次のように変更したいと思います。
myapp -a foooooooo1
\ -b foooo2
\ -c foooooooooooooooo3
\ -d foooooooo4
bar
最初のコード部分を変更するときにバックスラッシュが互いに正しく揃うように手動で調整する必要があるため、これを行いたいと思います。 2番目のコード部分では、パラメータの1つを変更してもバックスラッシュは移動しません。
答え1
シェルコマンドでは、引用符のないバックスラッシュは次の文字をエスケープします。言い換えれば、次の文字に特別な意味がある場合、バックスラッシュはその文字の特別な意味を削除します。
改行文字は、;
他の文字と同様にコマンド終端者です。バックスラッシュは改行文字からその機能を削除し、コマンドが次の行から続行できるようにします。ところで、続けるべき行末のバックスラッシュの後に空白文字を持てない理由は、バックスラッシュが実際の改行文字をエスケープしないからです。
シェルは提案したコードを正しく解析できません。代わりに、各行を別々のコマンドで実行しようとします。
シェルが配列(例:bash
has)をサポートしている場合、いくつかのケースで役に立つかもしれない別のアプローチは、次のようにコマンドを配列に保存することです。
mycommand=(
myapp -a 'foo foo'
-b 'bar bar'
-c 'baz baz'
-d 'qux qux'
bar
)
この配列割り当ての改行文字は、空白と同様に、配列要素間の区切り文字としてのみ使用されます。埋め込みスペースを必要とする要素は、例に示すように引用する必要があります(いずれの場合でも、コマンドラインで引用する必要があるのと同じように)。
このコマンドを実行するには、以下を使用できます。
"${mycommand[@]}"
二重引用符は次のとおりです。基本的な。配列の各要素が個別に参照されるようにします。
または、パラメータの配列を使用してください。
myapp_args=(
-a 'foo foo'
-b 'bar bar'
-c 'baz baz'
-d 'qux qux'
bar
)
それから:
myapp "${myapp_args[@]}"