シェルスクリプトで与えられた引数をそのままスクリプト内で呼ばれるコマンドに引き渡す方法

こんにちは、さるまりんです。

タイトルの通りなのですが、シェルスクリプトを作成する時、コマンドライン上でもらった引数をそのまま内側で呼ばれるコマンドに引き渡したい時があります。

そんな時は$@を利用します。
$@は渡された引数全てをそのまま展開します。引数の区切りが保たれるように、"$@"とダブルクオート(二重引用符)で囲んで使います。

例:引数をコマンドにそのまま渡すスクリプト

lsl.sh

#!/bin/sh

# もらった引数をlsコマンドにそのまま渡します
ls -l "$@"

こんな風に実行できます。(macOS上での実行例です)

$ ./lsl.sh /tmp/ /Users/
/Users/:
total 0
drwxr-xr-x+ 12 201         _guest   384  8  5  2020 Guest
drwxrwxrwt  24 root        wheel    768 11 21 19:06 Shared
drwxr-xr-x+ 55 salumarine  staff   1760 12 20 22:54 salumarine

/tmp/:
total 0
drwx------  3 salumarine  wheel  96 12 15 13:10 com.apple.launchd.QGiqOEh2tx

スクリプト内部で呼び出されるコマンドの実行結果と一緒です。

$ ls -l /tmp/ /Users/
/Users/:
total 0
drwxr-xr-x+ 12 201         _guest   384  8  5  2020 Guest
drwxrwxrwt  24 root        wheel    768 11 21 19:06 Shared
drwxr-xr-x+ 55 salumarine  staff   1760 12 20 22:54 salumarine

/tmp/:
total 0
drwx------  3 salumarine  wheel  96 12 15 13:10 com.apple.launchd.QGiqOEh2tx

引数がないとエラーになる場合やない場合は別のコマンドを実行する場合はこんな風に引数の存在チェックすることもできます。

#!/bin/sh

if [ "$#" -eq 0 ]; then
    echo "Usage: $0 [arguments]"
    exit 1
fi

command "$@"

引数があればcommandに引数を渡して実行しますが、引数がない場合は

Usage: $0 [arguments]

と表示($0はスクリプト名)して処理を終わります。

シェルスクリプトにすると便利にシステムを使うことができるかなと思っているので、いろんな使い方を勉強したいと思います。

読んでくださってありがとうございました。

それではまた!