こんにちは、さるまりんです。
タイトルの通りなのですが、シェルスクリプトを作成する時、コマンドライン上でもらった引数をそのまま内側で呼ばれるコマンドに引き渡したい時があります。
そんな時は$@
を利用します。
$@
は渡された引数全てをそのまま展開します。引数の区切りが保たれるように、"$@"
とダブルクオート(二重引用符)で囲んで使います。
例:引数をコマンドにそのまま渡すスクリプト
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
はスクリプト名)して処理を終わります。
シェルスクリプトにすると便利にシステムを使うことができるかなと思っているので、いろんな使い方を勉強したいと思います。
読んでくださってありがとうございました。
それではまた!