シェルスクリプト

シェルで長いコマンドを複数行に記述する

投稿日:

シェルでは一般にコマンドを1行で記述し、Enterキーで改行を入力することでコマンドを実行します。

これは「改行」がコマンドラインが完結したことを意味するからです。シェルはコマンドラインの完結したことを知ると、そのコマンドラインを解釈してコマンドを実行します。

シェルスクリプトでも同様に改行によりコマンドラインが完結します。つまりシェルスクリプトでもコマンドは通常1行で記述する必要があります。

しかし、コマンドが非常に長くなってしまうと見づらくなって不便なことがあります。そのような場合のためにコマンドラインを複数行に渡って記述する方法が用意されています。ここではその方法を紹介します。

コマンドを複数行に渡って記述する

コマンドを複数行にわたって記述するには改行の直前にバックスラッシュ(\)を置きます。するとシェルはバックスラッシュの直後の「改行を無視」します。

例えば次のようにシェルに入力し、バックスラッシュ(\)の直後でEnterキーをタイプしてください。

$ echo foo \
> 

すると改行は無視され、シェルは「>」を表示して次の入力を待ちます。「>」はシェルのプロンプトで、2行目以降は通常のプロンプトとは異なる文字が使われます。この文字は環境によって異なります。

続けて次のように入力して最後にEnterキーを押します。

$ echo foo \
> bar
foo bar

ここで初めてコマンドが実行され、結果が表示されます。

このようにバックスラッシュ(\)を使うとコマンドラインは複数行に渡って書くことができます。

シェルスクリプトの中でもバックスラッシュ(\)の直後に改行することで、複数行に渡ってコマンドラインを記述することができます。

#!/bin/sh
echo foo \
     bar

ここで2行目は空白でインデントしても意味が変わらないため、見やすいようにインデントしています。

ダブルクォーテーションの中でバックスラッシュを使う

バックスラッシュを使って改行を無視させる方法は、ダブルクォーテーション(")の中でも使えます。

$ echo "foo  \
> bar"
foo  bar

ここでも改行は無視され、結果は1行で表示されます。

この場合は次のように書いても同様の効果が得られます。

$ echo "foo "\
> "bar"

改行は無視されるのでこれは「"foo ""bar"」と記述したのと同じです。並べられた文字列は連結されるので結果的に「"foo bar"」がechoの引数として渡されます。

なおダブルクォーテーション(")やシングルクォーテーション(')の中で、改行はそのまま改行文字として扱われます。

$ echo "foo  
> bar"
foo  
bar
$ echo 'foo
> bar'
foo
bar

シングルクォーテーションの中で「\」は通常文字として扱われますので、「\」の直後に改行しても、それはそのまま改行文字として扱われます。

$ echo 'foo  \
> bar'
foo  \
bar

行の分割はわかりやすいところで行う

最後に注意点として、コマンドラインはわかりやすい位置で分割しましょう。

先程の例を次のようにして書いてしまうのは間違いです。

$ echo foo\
> bar
foobar

これはfooの後に空白がないので「foobar」という1つの引数となってしまいます。

前述のように、fooの後に区切り文字である空白を記述してから、バックスラッシュと改行を使うのがわかりやすいと思います。

まとめ

バックスラッシュの直後の改行のみ改行が無視されます。

バックスラッシュと改行の間に空白などがあってはいけません。これは見た目では分かりませんので注意してください。

-シェルスクリプト
-, ,

Copyright© アナグマのモノローグ , 2022 All Rights Reserved Powered by STINGER.