シェルスクリプトで、受け取った引数をすべて別のコマンドに渡す

> `bash` のシェル・スクリプトが受け取った引数を、内部で別のコマンドに「丸ごと引数を渡したい」。**問題はスペース入りの引数**があること。

例えば `bash` スクリプト `hoge.sh` で、`$ ./hoge.sh arg1 arg2 arg3 ...` と、**受け取った「引数の個数が不特定」の内容をスクリプト内のコマンドにまんま渡したい**。

パースと言うより、プロクシというか、むしろパスする感じ。

[『`bash` `受け取った引数` `すべて` `渡す`』を Qiita 記事に絞ってググって](https://www.google.com/search?q=site:qiita.com+bash+%E5%8F%97%E3%81%91%E5%8F%96%E3%81%A3%E3%81%9F%E5%BC%95%E6%95%B0+%E3%81%99%E3%81%B9%E3%81%A6+%E6%B8%A1%E3%81%99)も、[「`bash` `引数` `すべて` `渡す` `受け取り`」 とググって](https://www.google.com/search?q=site:qiita.com+bash+%E5%BC%95%E6%95%B0+%E3%81%99%E3%81%B9%E3%81%A6+%E6%B8%A1%E3%81%99+%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8A&tbs=qdr:y)も、タイトルからピンポイントで判断できなかったので、未来でもエンジニアよりは<ruby>猿人に<rt>えんじん</rt>近い<rt>near</rt></ruby>、検索猿人な自分への<ruby>ググラビリティ<rt>備忘録</rt></ruby>として。

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

1. 引数の値は特殊変数「`@`」に格納されています。
2. 「`"$@"`」と**ダブル・クォート付き**で（引数の要素ごとのまま）再利用できます。
3. コマンド名が長い場合や、コマンドに渡す前に事前処理するのに便利です。

```bash:short.sh
#!/bin/bash

# 受け取ったスクリプトの引数の内容を、丸ごと別のコマンドに渡す
/bin/bash /path/to/very_long_script_name.sh "$@"
```

- [オンラインで動作をみる](https://paiza.io/projects/AnMBke9Pu38tYTC82anfYg) @ 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 <sub><sup><sub><sup>（長いコマンド名を短くしたいんです）</sup></sub></sup></sub>

長いと言うより、どうも「覚えにくいコマンド名を俺様ネーミングで使いたかった」のです。

単純なコマンドのリネームであれば、`.bash_profile` などに <a href="https://www.google.com/search?q=site:qiita.com+bash+alias+%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89&tbs=qdr:y"><code>alias</code> コマンド</a>を使うのが楽です。

しかし、単純なエイリアスでなく、前処理を少しゴニョゴニョしてから別コマンドに渡したいのです。具体的には、`mdless`[^mdless] コマンドを `md` にリネームしたいのです。

[^mdless]: **<code>[mdless](https://brettterpstra.com/projects/mdless/)</code>とは**、Ruby 製の Markdown ビューアーで、コマンドライン（ターミナル）上で Markdown ファイルを整形して表示してくれるコマンドです。

```bash:md
#!/usr/bin/env bash

# 下ごしらえ
....

# 実行
mdless "$@"
```

### 参考文献＆あわせて読みたい

- 「[位置パラメーターの一括展開 $* $@ "$*" "$@" の違いを知れ!!](https://fumiyas.github.io/2016/12/15/positional-parameters.sh-advent-calendar.html)」| Shell Script Advent Calendar 2016 @ ダメ出し Blog
- [「スクリプトに与えた引数の数」| 特別な変数](https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337#%E7%89%B9%E5%88%A5%E3%81%AA%E5%A4%89%E6%95%B0) | 初心者向けシェルスクリプトの基本コマンドの紹介 @ Qiita
- 「[$*, $@, "$@" の違い](https://qiita.com/Ping/items/57fd75465dfada76e633#---%E3%81%AE%E9%81%95%E3%81%84)」| Bashの便利な構文だがよく忘れてしまうものの備忘録 ＠ Qiita
- 「[変数のデフォルト値を指定](https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d#%E5%A4%89%E6%95%B0%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E5%80%A4%E3%82%92%E6%8C%87%E5%AE%9A)」| 初心者向け、「上手い」シェルスクリプトの書き方メモ @ Qiita
- 「[コマンドの出力を別のコマンドの入力にする](https://qiita.com/tag1216/items/7ce35b7c27d371165e56#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E5%88%A5%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%AB%E3%81%99%E3%82%8B)」| シェルの入出力制御あれこれ @ Qiita
- 「[いっそ自前で解析しちゃう](https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb#%E3%81%84%E3%81%A3%E3%81%9D%E8%87%AA%E5%89%8D%E3%81%A7%E8%A7%A3%E6%9E%90%E3%81%97%E3%81%A1%E3%82%83%E3%81%86)」| bash によるオプション解析 @ Qiita