よく使うけどよくググるシェルスクリプト小技集

# はじめに

「よく使うけどよくググる」
つまり、忘れがちだったり、コピペすることが多いものをまとめています。

# 目次

- [シェバン](https://qiita.com/yukiarrr/items/7a843fd104d49dc0e3cc#%E3%82%B7%E3%82%A7%E3%83%90%E3%83%B3)
- [スクリプトのディレクトリに移動](https://qiita.com/yukiarrr/items/7a843fd104d49dc0e3cc#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E7%A7%BB%E5%8B%95)
- [スクリプトの親ディレクトリの絶対パスを取得](https://qiita.com/yukiarrr/items/7a843fd104d49dc0e3cc#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E8%A6%AA%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E7%B5%B6%E5%AF%BE%E3%83%91%E3%82%B9%E3%82%92%E5%8F%96%E5%BE%97)
- [case文での条件分岐](https://qiita.com/yukiarrr/items/7a843fd104d49dc0e3cc#case%E6%96%87%E3%81%A7%E3%81%AE%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90)
- [文字列が空文字かチェック](https://qiita.com/yukiarrr/items/7a843fd104d49dc0e3cc#%E6%96%87%E5%AD%97%E5%88%97%E3%81%8C%E7%A9%BA%E6%96%87%E5%AD%97%E3%81%8B%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF)
- [ファイルが存在するかチェック](https://qiita.com/yukiarrr/items/7a843fd104d49dc0e3cc#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E3%81%8B%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF)
- [コマンドが存在するかチェック](https://qiita.com/yukiarrr/items/7a843fd104d49dc0e3cc#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E3%81%8B%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF)
- [OSの判別](https://qiita.com/yukiarrr/items/7a843fd104d49dc0e3cc#os%E3%81%AE%E5%88%A4%E5%88%A5)
- [Linuxディストリビューションの判別](https://qiita.com/yukiarrr/items/7a843fd104d49dc0e3cc#linux%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%88%A4%E5%88%A5)
- [Yes or No で処理分岐](https://qiita.com/yukiarrr/items/7a843fd104d49dc0e3cc#yes-or-no-%E3%81%A7%E5%87%A6%E7%90%86%E5%88%86%E5%B2%90)

# 小技集

## シェバン

```sh
#!/bin/bash
```

エラーが出た際にスクリプトを停止したい場合は、

```sh
#!/bin/bash -e
```

## スクリプトのディレクトリに移動

```sh
cd $(dirname $0)
```

## スクリプトの親ディレクトリの絶対パスを取得

```sh
hoge=$(dirname $(cd $(dirname $0); pwd))
```

`$(dirname $(dirname $0))`だと、`$0`が`./hoge.sh`のような相対パスだった場合に挙動がおかしくなるので注意。

## case文での条件分岐

```sh
case "$hoge" in
  'a' ) echo 'a' ;;
  'b' ) echo 'b' ;;
  * ) exit 1 ;;
esac
```

## 文字列が空文字かチェック

空文字ではない場合

```sh
if [ -n "$hoge" ]; then
  echo "$hoge"
fi
```

空文字の場合

```sh
if [ -z "$hoge" ]; then
  echo 'empty'
fi
```

## ファイルが存在するかチェック

ファイルが存在する場合

```sh
if [ -e $hoge ]; then
  echo "$hoge"
fi
```

ファイルが存在しない場合

```sh
if [ ! -e $hoge ]; then
  echo 'not exists'
fi
```

## コマンドが存在するかチェック

コマンドが存在する場合

```sh
if type hoge > /dev/null 2>&1; then
  hoge --help
fi
```

コマンドが存在しない場合

```sh
if ! type hoge > /dev/null 2>&1; then
  echo 'not exists'
fi
```

## OSの判別

Macの場合

```sh
if [ "$(uname)" = 'Darwin' ]; then
  echo 'macos'
fi
```

Linuxの場合

```sh
if [ "$(uname -s | cut -c -5)" = 'Linux' ]; then
  echo 'linux'
fi
```

Windowsの場合

```sh
if [ "$(uname -s | cut -c -5)" = 'MINGW' -o "$(uname -s | cut -c -7)" = 'MSYS_NT' ]; then
  echo 'windows'
fi
```

## Linuxディストリビューションの判別

Ubuntu/Debian系の場合

```sh
if [ -e /etc/debian_version -o -e /etc/debian_release ]; then
  apt --help
fi
```

Fedora/RedHat系の場合

```sh
if [ -e /etc/fedora-release -o -e /etc/redhat-release ]; then
  yum --help
fi
```

## Yes or No で処理分岐

```sh
read -p 'yes or no? [y/N]: ' yn
if [ "$yn" != 'y' ]; then
  echo 'no...'
  exit
fi
```

# まとめ

ひとまず思いついたものをあげてみました。
その他、「よく使うけどよくググる」がありましたら、まとめていきたいと思います。

GitHub: [@yukiarrr](https://github.com/yukiarrr)
Twitter: [@yukiarrr](https://twitter.com/yukiarrr)