目次
- 1 目的
- 2 基本事項と構造
- 3 ニーズ別コマンド一覧
- 3.1 変数の指定がしたい
- 3.2 引数の指定がしたい
- 3.3 条件分岐がしたい
- 3.4 繰り返し処理がしたい
- 3.5 ユーザー入力を受け付けたい
- 3.6 関数としてまとめたい
- 3.7 ファイルを呼び出したい
- 3.8 数値を計算したい
- 3.9 ファイルを一行ずつ読み込みたい
- 3.10 指定した引数をすべて表示させたい
- 3.11 指定した引数をつなげたい
- 3.12 指定した引数の個数を知りたい
- 3.13 引数を一つずつ読み込みたい
- 3.14 終了ステータスが知りたい
- 3.15 シェル変数を環境変数にしたい
- 3.16 変数の文字の長さを知りたい
- 3.17 変数の中から文字を切り出したい
- 3.18 変数の中の文字を置換したい
- 3.19 変数の中の文字を削除したい
- 3.20 変数を間接的に参照したい
- 3.21 標準出力したものをファイルに出力したい
- 3.22 エラー出力をファイルに出力したい
- 3.23 標準出力とエラー出力の両方をファイルに出力したい
- 3.24 ファイル名だけ取り出したい
- 3.25 ディレクトリだけ取り出したい
- 3.26 一定時間停止したい
- 3.27 配列として保存したい
- 4 まとめ
目的
Shell Scriptのコマンドを結構忘れがちなので、思い出す用として残しておく
基本事項と構造
単純コマンド:cdやls、echoなど
複合コマンド:ifやcase、for、while、関数など
パイプライン:「|」でつないでコマンドをつなぐ(例) ls -l | less)
リスト:パイプラインを改行または;で区切って並べる(例) cd ./test; ls -l)
宣言:1行目には使用するシェルのタイプを宣言する。何のスクリプトを実行するかここで判断される(例) #!/bin/bash)
実行:「chmod +x ファイル名」と実行すると宣言したスクリプトを自動的に見に行くようになり、./ファイル名で実行できる。
例)
- #!/bin/bash
- chmod +x ファイル名
- ./ファイル名で実行可能に
ちなみに実行方法は、上記の方法の他に、引数としてファイル名を指定する実行でも問題ない。(例) 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っていう選択肢はいいですよね!