bash
のシェル・スクリプトが受け取った引数を、内部で別のコマンドに「丸ごと引数を渡したい」。問題はスペース入りの引数があること。
例えば bash
スクリプト hoge.sh
で、$ ./hoge.sh arg1 arg2 arg3 ...
と、受け取った「引数の個数が不特定」の内容をスクリプト内のコマンドにまんま渡したい。
パースと言うより、プロクシというか、むしろパスする感じ。
『bash
受け取った引数
すべて
渡す
』を Qiita 記事に絞ってググっても、「bash
引数
すべて
渡す
受け取り
」 とググっても、タイトルからピンポイントで判断できなかったので、未来でもエンジニアよりは猿人に近い、検索猿人な自分へのググラビリティとして。
TL; DR (今北産業)
- 引数の値は特殊変数「
@
」に格納されています。 - 「
"$@"
」とダブル・クォート付きで(引数の要素ごとのまま)再利用できます。 - コマンド名が長い場合や、コマンドに渡す前に事前処理するのに便利です。
short.sh
#!/bin/bash
# 受け取ったスクリプトの引数の内容を、丸ごと別のコマンドに渡す
/bin/bash /path/to/very_long_script_name.sh "$@"
- オンラインで動作をみる @ paiza.IO
動作確認み環境
- macOS Mojave(OSX 10.14.2, OSX 10.14.4)
- GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
- Raspbian GNU/Linux 8 (jessie)
- GNU bash, バージョン 4.3.30(1)-release (arm-unknown-linux-gnueabihf)
TS; DR (長いコマンド名を短くしたいんです)
長いと言うより、どうも「覚えにくいコマンド名を俺様ネーミングで使いたかった」のです。
単純なコマンドのリネームであれば、.bash_profile
などに alias
コマンドを使うのが楽です。
しかし、単純なエイリアスでなく、前処理を少しゴニョゴニョしてから別コマンドに渡したいのです。具体的には、mdless
1 コマンドを md
にリネームしたいのです。
md
#!/usr/bin/env bash
# 下ごしらえ
....
# 実行
mdless "$@"
参考文献&あわせて読みたい
- 「位置パラメーターの一括展開 $* $@ "$*" "$@" の違いを知れ!!」| Shell Script Advent Calendar 2016 @ ダメ出し Blog
- 「スクリプトに与えた引数の数」| 特別な変数 | 初心者向けシェルスクリプトの基本コマンドの紹介 @ Qiita
- 「$*, $@, "$@" の違い」| Bashの便利な構文だがよく忘れてしまうものの備忘録 @ Qiita
- 「変数のデフォルト値を指定」| 初心者向け、「上手い」シェルスクリプトの書き方メモ @ Qiita
- 「コマンドの出力を別のコマンドの入力にする」| シェルの入出力制御あれこれ @ Qiita
- 「いっそ自前で解析しちゃう」| bash によるオプション解析 @ Qiita