Shell Script 基本コマンド一覧

目的

Shell Scriptのコマンドを結構忘れがちなので、思い出す用として残しておく

基本事項と構造

単純コマンド:cdやls、echoなど

複合コマンド:ifやcase、for、while、関数など

パイプライン:「|」でつないでコマンドをつなぐ(例) ls -l | less)

リスト:パイプラインを改行または;で区切って並べる(例) cd ./test; ls -l)

宣言:1行目には使用するシェルのタイプを宣言する。何のスクリプトを実行するかここで判断される(例) #!/bin/bash)

実行:「chmod +x ファイル名」と実行すると宣言したスクリプトを自動的に見に行くようになり、./ファイル名で実行できる。

例)

  1. #!/bin/bash
  2. chmod +x ファイル名
  3. ./ファイル名で実行可能に

ちなみに実行方法は、上記の方法の他に、引数としてファイル名を指定する実行でも問題ない。(例) bash ファイル名)

ニーズ別コマンド一覧

変数の指定がしたい

$

#!/bin/bash

var=1
echo "$var"

引数の指定がしたい

$1, $2, $3

#!/bin/bash

echo "$1" "$2" "$3"

実行↓
./ファイル名 1 2 3

条件分岐がしたい

if

#!/bin/bash

i=3
if [ "$i" = 3 ]
then
 echo "iの値は3"
elif [ "$i" = 8 ]
then
 echo "iの値は8"
else
 echo "iの値は不明"
fi

注意事項

[]の最初と最後はスペースをいれること

case

#!/bin/bash

case $1 in
 test)
  echo 'これはテストです';;
 open)
  echo 'これは本番です';;
 *)
  echo '値は不明です';;
esac

注意事項

各処理の後ろに「;;」が必要

&&リスト

test -f file1 && cp file1 file2

注意事項

左がtrueの時に右も実行される

||リスト

test -f file1 || exit 1

注意事項

左がfalseのときに右も実行される

繰り返し処理がしたい

for

#!/bin/bash

for ((i=1; i<=5; i++)){
 echo "$i"
}

注意事項

{}はdo、doneでも可能

while

#!/bin/bash

i=1
while [ "$i" -le 5 ]
do
 echo "$i"
 i=`expr "$i" + 1`
done

注意事項

[]の最初と最後はスペースをいれること

ユーザー入力を受け付けたい

select

#!/bin/bash

PS3='番号を選択してください'
select cmd in go back left right
do
 case $cmd in
  go)
   echo "行くぜ";;
  back)
   echo "下がろう";;
  left)
   echo "左へ";;
  right)
   echo "右へ";;
  *)
   echo "入力ミスです"
   break;;
 esac
done

関数としてまとめたい

function名()

#!/bin/bash

get_func(){
 echo "ゲットだぜ"
}

get_func

ファイルを呼び出したい

. もしくは source

#!/bin/bash

source ./test.sh
get_func

数値を計算したい

(()) もしくは expr

#!/bin/bash

i=1
echo $((i+2))
!/bin/bash

echo `expr 1 + 1`

ファイルを一行ずつ読み込みたい

read

以下ファイルを同ディレクトリに用意する。

import.txt

test
test1
test2
test3

これを一行ずつよみこむ

#!/bin/bash

while read a
do
 echo "$a"
done < ./import.txt

指定した引数をすべて表示させたい

$@

#!/bin/bash

echo "$@"

指定した引数をつなげたい

$*

#!/bin/bash

echo "$*"

指定した引数の個数を知りたい

$#

#!/bin/bash

echo "$#"

引数を一つずつ読み込みたい

shift

#!/bin/bash

while [ $# -gt 0 ]
do
 echo "$1"
 shift
done

終了ステータスが知りたい

$?

#!/bin/bash

echo "$?"

シェル変数を環境変数にしたい

export

#!/bin/bash

LANG=C; export LANG

環境変数の一時変更

#!/bin/bash

LANG=C date

変数の文字の長さを知りたい

${#変数名}

#!/bin/bash

var='dfgasdfa'
echo "${#var}"

変数の中から文字を切り出したい

${変数名:左から取り除く文字数:残りの表示する文字数}

!/bin/bash

var='dfgasdfa'
echo "${var:2:5}"

${変数名:左から取り除く文字数}

!/bin/bash

var='dfgasdfa'
echo "${var:2}"

変数の中の文字を置換したい

${変数名//置換対象文字/置換したい文字}

#!/bin/bash

var='aaaabbbbbcccc'
echo "${var//a/d}"

一番最初にでてきた文字だけ置換したい場合

${変数名/置換対象文字/置換したい文字}

#!/bin/bash

var='aaaabbbbbcccc'
echo "${var/a/d}"

変数の中の文字を削除したい

${変数名##パターン}

#!/bin/bash

i="aaaaaaabbvvvvvvv"
echo "${i##*a}"

一番最初にでてきた文字だけ削除したい場合

${変数名#パターン}

#!/bin/bash

i="aaaaaaabbvvvvvvv"
echo "${i#*a}"

右側から削除したい場合

${変数名%%パターン}

#!/bin/bash

i="aaaaaaabbvvvvvvv"
echo "${i%%*b}"

${変数名%パターン}

#!/bin/bash

i="aaaaaaabbvvvvvvv"
echo "${i%*b}"

変数を間接的に参照したい

${!変数名}

#!/bin/bash

var='aaaabbbbbcccc'
var2=var
echo "${!var2}"

標準出力したものをファイルに出力したい

>

#!/bin/bash

echo "hello" > file1

既存ファイルに追加出力したい場合

>>

#!/bin/bash

echo "hello" >> file1

エラー出力をファイルに出力したい

>2

#!/bin/bash

rm test4455 2> error_log

標準出力とエラー出力の両方をファイルに出力したい

&> もしくは > file 2>&1

#!/bin/bash

rm test4455 &> error_log

ファイル名だけ取り出したい

basename

#!/bin/bash

name=`basename /test/shell/shell.sh`
echo "$name"

ディレクトリだけ取り出したい

dirname

#!/bin/bash

name=`dirname /test/shell/shell.sh`
echo "$name"

一定時間停止したい

sleep

#!/bin/bash

sleep 5
echo "testです"

配列として保存したい

代入:配列名[添字]

参照:${配列名[添字]}

#!/bin/bash

array[1]="hello"
echo "${array[1]}"

一気に配列に値を入れたい場合

代入:配列名=(値)

参照:${配列名[@]}

#!/bin/bash

array=(hello world yes)
echo "${array[@]}"

ひとつずつ配列にいれていきたい場合(以下は引数の値をループしていれている)

!/bin/bash

i=1
for arg in "$@"
do
 array[i]=$arg
 ((i++))
done
echo "${array[@]}"

まとめ

最近Shell Scriptに触れる機会が増えたのでまとめときました。ほぼ自分用に。

案外Shell Scriptでできることって多かったんだなと思いました。データ処理でも意外と汎用性高いな〜と。

PythonやRでやればいいじゃんって思うかもしれないですが、バカでかい規模のインフラがたくさんあって、それぞれで違う環境使ってて、処理を統一化しないといけないっていうパターンだと、PythonやRだと汎用性に欠けます。それぞれのサーバーで環境を統一していってなんてやってたら、一生終わる気がしない(笑)

「どんな環境でもだいたい実行できる処理」を考えたときにShell Scriptっていう選択肢はいいですよね!

ABOUTこの記事をかいた人

株式会社メンバーズ データアドベンチャー所属 データエンジニアとしてデータ基盤の構築から運用を行っております。 得意なことは、データ活用推進です。 日々の学びをアウトプットしていきます。