💻

自作コマンドの作りかた

2024/03/28に公開

ふと自作コマンドの作り方が気になったので、調べてみました。

要約

  1. コマンド保存用ディレクトリを作る
  2. PATHを通す
  3. コマンド内容をShellScriptで書く
  4. 権限を与える

作成方法

コマンドファイル保存用ディレクトリを用意する

今回は個人用のコマンドと仮定してホームディレクトリ直下に作ります。システム全体で使用するなら /usr/local/bin 配下にすべきか?
ディレクトリ名はcommandsにしました。

$ mkdir ~/commands

PATHを通す

シェルの設定ファイルにPATHを通します。
zshなら~/.zshrc、Bashなら~/.bash_profileです。

export PATH=$HOME/commands:$PATH

保存したらsourceで反映させましょう。

$ source ~/.zshrc
#source ~/.bash_profile

コマンド(スクリプト)を書く

先ほど作成したcommandsディレクトリにコマンドとして動かしたい内容を記載したファイルを作成します。
このファイル名がそのままコマンド名になります。また、拡張子は付けないで作成します。

ちなみに私はtestコマンドの存在を知らず、ファイル名をtestにした為、自作コマンドが実行されずに嘆きました。

$ vim ~/commands/hello-world
#!/bin/sh
echo "Hello, World!"

引数を渡したい場合

引数は$1$2$3... でアクセスできます。
$0 はスクリプト自体の名前を表します。
すべての引数に対して一度でアクセスするには、$@$* を使用します。

#!/bin/sh
# 引数の例: コマンド名 arg1 arg2

echo "コマンド名: $0"
echo "第一引数: $1"
echo "第二引数: $2"
echo "すべての引数: $@"

必須の引数を設定したい

#!/bin/sh
# 引数が足りない場合のチェック
if [ "$#" -lt 1 ]; then
  echo "引数を設定してください"
  exit 1
fi

echo "引数は$1です"
# 他の処理...

オプションに引数を渡したい

getoptsを使用します。

#!/bin/sh
#オプションAに引数を渡す

while getopts "A:" opt; do
    case ${opt} in
    A )
        # $OPTARG にはオプションに対する引数が格納される
        echo "Option -A was triggered with argument $OPTARG"
        ;;
    \? )
        echo "Usage: $0 [-A] arg"
        ;;
    esac
done

実行権限を付与

先ほど作成したファイルに対して実行権限を付与します。
他のユーザーが使用する場合などは権限を調整する必要がありますが、今回は自分しか使わない想定なのでとりあえず755とします。

$ chmod 755 ~/command/hello-world

実行

$ hello-world
Hello, World!

これでコマンドの自作ができました。
出退勤用のページを叩くスクリプトを作ってコマンド化すればCLIから打刻ができたりするなあと思ったので気が向いたら作ってみます。

ソーシャルデータバンク テックブログ

Discussion