備忘録。
CUIではほとんど WSL1/ubuntu を使っています。WSL2の方が実行パフォーマンスはいいんでしょうけど・・・。
WSL1メインとはいいつつ、コマンドプロンプト(cmd.exe)を全く使わない・・・ということはない。たとえばタスクスケジューラに仕事をしてもらいたい処理は バッチファイル(CMDファイル)に書いて渡す方が何かとトラブルは少なくなりますし。
bitlockerで暗号化しているVHDファイルのマウント処理とかをWindowsのスタートアップスクリプトに登録したりとか、ログオン/ログアウトスクリプトに、後始末するスクリプトとか・・・Windowsのサービスを制御したりとか、コンピュータ名とIPアドレスの対応を調べたりとか、IPのルーティングを変えたりとか、やっぱりcmdファイル(バッチファイル)じゃないと不便なこともあります。
Powershellもありますが・・・ps1ファイルの実行がデフォルトでブロックされているので他所のPCで手軽に動かせない・・・とか、なんかイマイチです。
bashでのシェルスクリプトもウェブ開発では必須なので、いろんな処理の自動化スクリプトをちょくちょく書きます。
・・・で、bashとcmdのスクリプトをいったりきたり、色々書く時いつも躓くのは、変数展開の文法・・・要は書き方をよく忘れてしますこと。頭は悪い上、加齢でどんどん記憶力が落ちていく・・・。
あれ、bashのシェルスクリプトのこういう書き方って、バッチファイルではどうやるんだっけ???ということが度々あるので、カンタンな対応・比較表があれば便利だなと思い、メモついでに書いておく。
最低限こんだけ覚えてればなんとかなる・・・かもしれない。
bash | cmd | |
---|---|---|
1行目 | #!/bin/bash | @echo off |
変数代入 | hoge=”This is a sample” | SET hoge=This is a sample |
変数参照 | echo $hoge or echo ${hoge} | echo %hoge% |
入力 | echo -n “please input: ” read hoge echo $hoge |
SET /P hoge=please input: echo %hoge% |
文字列置換 | hoge=”this is my appple pen” echo ${hoge//this/that} |
SET hoge=this is my appple pen echo %hoge:this=that% |
部分文字列 | hoge=”this is my appple pen” echo ${hoge:8:2} echo ${hoge:8} |
SET hoge=this is my appple pen echo %hoge:~8,2% echo %hoge:~8% |
パス分解 パス ベース名 拡張子 ファイル名 |
echo $0 echo ${0%/*} filename=${0##*/}; echo ${filename%.*} echo ${0##*.} echo ${0##*/} |
echo %0 echo %~dp0 echo %~n0 echo %~x0 echo %~nx0 |
日付時刻 乱数(簡易) |
echo $(date) echo $RANDOM |
echo %DATE% %TIME% echo %RANDOM% |
IF-ELSE文 | if [ expression ] ; then … else … fi |
if expression ( command1 command2 …. ) else ( command3 command4 … ) |
ループ(while) | while [ expression ] do … done |
loop: … if expresssion goto loop ※gotoで代替 |
実行結果の変数への格納 |
VAR=$(command arg1 arg2) VAR=`command arg1 arg2` |
FOR /F “usebackq delims=” %%A IN (`command arg1 arg2`) DO ( SET VAR=%%A ) |
CSVでのX列目取得 | COLX=`echo $str | cut -d, -f X -s` | FOR /F ” delims=, tokens=X” %%A IN (“%STR%”) DO SET COLX=%%A |
間違いは随時修正中。思いついたら随時追加中。