Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2722

シェルスクリプトやってみようよ

$
0
0

Linux、コマンド、シェル、、、、そういう類の食わず嫌いを克服しました!!
この記事では、私が参考にさせていただいたサイトを紹介しながら、疑問点や解釈を補足していきます。
この記事が、「やってみよかな」「黒い画面こわい」と思っている方の一助になれば幸いです。

シェルスクリプトって何?

これはいろいろなところで解説されていますが、私の解釈でひとことで言うとPCへの命令をひとまとめにしたプログラムです。

たとえば、ファイル名を変更したいとき。
複数あるファイル名の「試験」と「テスト」の文言の揺らぎを統一したいときに、ファイルやディレクトリを指定して一気にリネームする。とか。

もうひとつ例、実行したコマンドのログのファイルを毎日作成したい(ロギング、というらしい)。とか。
・・・まって、それはバッチ処理のことじゃないの??と思い、調べました。
→ https://wa3.i-3-i.info/word11221.html
どうやらシェルスクリプトとバッチファイルは役割は同じで、ベースの世界が違うだけらしい。

スクリプト作成方法と実行方法

macOSの方は環境構築等なしでターミナルから実行できますが、Windowsの方は準備が必要です。「Windows Linux」等でググってみてください:bow_tone1:

以下のスクリプト作成方法と実行方法を参考にしました↓
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とかはパッと使いたいけど覚えにくい。。。
英語を知ると少しだけ覚えやすくなりますね!

演算子    英語意味
eqequalx = y
gegreater than or equal tox >= y
gtgreater thanx > y
leless than or equal tox <= y
ltless thanx < y
nenot equalx != y

実用的なスクリプト作ってみよう

その1:ファイル名を一括リネームする

以下のサイトを参考にしました
http://motw.mods.jp/shellscript/rename.html

その2:バックアップフォルダにファイルやフォルダをコピーする

こちらは自分で考えて作成してみました。

make_bk.sh
#!/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

:blush:

次は、
フォルダごとコピー&バックアップフォルダが存在している場合は対象をコピーするだけ
を確認します。

実行前のフォルダ構成
 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

:blush::blush::blush:

おまけ:便利なLinuxコマンド

学習していく中で「便利だな、使いそうだな」と思ったコマンドのメモです。
◆historyコマンド実行時に日時も表示させたい
 参考:https://linuxfan.info/add-datetime-to-history
◆作業ログを記録したい
 参考:https://dev.classmethod.jp/articles/scriptcommand/

おわりに

基本は掴めたはず!何事もやってみるもんですね。
今回の目的はスクリプトに慣れることだったので、作成したスクリプトの実用性を問われるとなんとも言えませんが、
これから作業していく中で「これ自動化したい」「このコマンドまとめられる!?」と思ったときに作れそうな気がするので、時が来るのを楽しみにします、、、
次の段階として、実行速度や再利用性などにも気を遣えるよう勉強していきます…!


Viewing all articles
Browse latest Browse all 2722

Trending Articles