Linux、コマンド、シェル、、、、そういう類の食わず嫌いを克服しました!!
この記事では、私が参考にさせていただいたサイトを紹介しながら、疑問点や解釈を補足していきます。
この記事が、「やってみよかな」「黒い画面こわい」と思っている方の一助になれば幸いです。
シェルスクリプトって何?
これはいろいろなところで解説されていますが、私の解釈でひとことで言うとPCへの命令をひとまとめにしたプログラムです。
たとえば、ファイル名を変更したいとき。
複数あるファイル名の「試験」と「テスト」の文言の揺らぎを統一したいときに、ファイルやディレクトリを指定して一気にリネームする。とか。
もうひとつ例、実行したコマンドのログのファイルを毎日作成したい(ロギング、というらしい)。とか。
・・・まって、それはバッチ処理のことじゃないの??と思い、調べました。
→ https://wa3.i-3-i.info/word11221.html
どうやらシェルスクリプトとバッチファイルは役割は同じで、ベースの世界が違うだけらしい。
スクリプト作成方法と実行方法
macOSの方は環境構築等なしでターミナルから実行できますが、Windowsの方は準備が必要です。「Windows Linux」等でググってみてください
以下のスクリプト作成方法と実行方法を参考にしました↓
https://udemy.benesse.co.jp/development/web/shellscript.html
エディタはVi(ヴィーアイ)を利用していますが、テキストエディタならだいたいなんでもいけるはず。
最近は、Viの進化版であるVim(ヴィム)が人気らしい。
ViやVimは設定すればコードの色分けができますが、今回は割愛します。
VS Codeだと自動で色分けしてくれて見やすいです。優しい。
シェルスクリプトの基本を叩き込む
以下をひととおり学習しました↓
http://motw.mods.jp/shellscript/tutorial.html
比較演算子の覚え方
-eqは分かるけど、-gtとか-leとかはパッと使いたいけど覚えにくい。。。
英語を知ると少しだけ覚えやすくなりますね!
演算子 | 英語 | 意味 |
---|---|---|
eq | equal | x = y |
ge | greater than or equal to | x >= y |
gt | greater than | x > y |
le | less than or equal to | x <= y |
lt | less than | x < y |
ne | not equal | x != y |
実用的なスクリプト作ってみよう
その1:ファイル名を一括リネームする
以下のサイトを参考にしました
http://motw.mods.jp/shellscript/rename.html
その2:バックアップフォルダにファイルやフォルダをコピーする
こちらは自分で考えて作成してみました。
#!/bin/bashread-p"バックアップをとりたいファイル名またはフォルダ名を入力してください:" ary
echo$ary#入力値がない場合、エラーメッセージを表示し終了するif[-z$ary];then
echo"バックアップを取りたいファイル名またはフォルダ名を入力してください"exit 1
fi#バックアップフォルダを作成。-pオプションで、フォルダが存在しないときだけ新規作成されるbkdir=bk_$(date +%Y%m%d)mkdir-p$bkdir#入力されたファイルまたはフォルダをひとつづつ読み取るfor target in${ary[@]}do#コピーを作成し、バックアップフォルダに格納する[-d$target]&&cp-r$target$bkdir/$target||cp$target$bkdir/$targetdone
このスクリプトでは、ファイルやフォルダの数を限定していないので、入力を受け付けるときに配列を利用しました。
配列の使い方は、以下を参考にしました。
https://www.atmarkit.co.jp/ait/articles/1905/22/news004.html
以下の部分について。
[ -d $target ] && cp -r $target $bkdir/$target || cp $target $bkdir/$target
cpコマンドでは、フォルダ(=ディレクトリ)をコピーするときは「-rオプション」が必要なため、$targetがディレクトリかどうか判断してからcpコマンドを実行しています。
他に良い方法ありましたらご教示いただけると嬉しいです。
実行してみましょう
tmp
├── make_bk.sh
└── test.txt //こいつをコピーします
実行します
$ bash make_bk.sh
バックアップを取りたいファイル名またはフォルダ名を入力してください:test.txt
test.txt
tmp
├── bk_20200329 //新規作成されたフォルダ
│ └── test.txt //コピーされたファイル
├── make_bk.sh
└── test.txt
次は、
フォルダごとコピー&バックアップフォルダが存在している場合は対象をコピーするだけ
を確認します。
tmp
├── bk_20200329
│ └── test.txt
├── make_bk.sh
├── test.txt
└── test2 //こいつをコピーします
└── test2.txt //同時にコピーされるはず
実行します
$ bash make_bk.sh
バックアップを取りたいファイル名またはフォルダ名を入力してください:test2
test2
tmp
├── bk_20200329
│ ├── test.txt
│ └── test2 //コピーされたフォルダ
│ └── test2.txt //一緒にコピーされたファイル
├── make_bk.sh
├── test.txt
└── test2
└── test2.txt
おまけ:便利なLinuxコマンド
学習していく中で「便利だな、使いそうだな」と思ったコマンドのメモです。
◆historyコマンド実行時に日時も表示させたい
参考:https://linuxfan.info/add-datetime-to-history
◆作業ログを記録したい
参考:https://dev.classmethod.jp/articles/scriptcommand/
おわりに
基本は掴めたはず!何事もやってみるもんですね。
今回の目的はスクリプトに慣れることだったので、作成したスクリプトの実用性を問われるとなんとも言えませんが、
これから作業していく中で「これ自動化したい」「このコマンドまとめられる!?」と思ったときに作れそうな気がするので、時が来るのを楽しみにします、、、
次の段階として、実行速度や再利用性などにも気を遣えるよう勉強していきます…!