Quantcast
Viewing all articles
Browse latest Browse all 2722

Linux bash使いのためのWindowsスクリプティング

Linux bashではゴリゴリとスクリプト書いてるのに、Windowsになるといまいち書けないって人向けの記事。 Linuxでbashならこう書くんだけどなぁ、ってのをことあるごとに調べたくないので、そのためのまとめ。 はじめに 前提 WSL2とかを使えば、WindowsでもネイティブなLinux bashは使えるけど、商用環境向けで気軽にミドルウェア追加できないとか、そのためだけに構成変更できない(したくない)という状況向け。 Windows環境で最初から使える(主に)PowerShellやコマンドスクリプト(*.cmd)、VBSなどでの書き方がメイン。 純開発者向けよりは半インフラ担当者向けかも(もちろん開発者がLinux向けのスクリプトをWindows向けにバックポートする際にも活用はできるものかと)。 PowerShellよりもコマンドスクリプトファースト(PowerShellは細かいバージョンの違いが面倒なため)←個人的な好みに近い Linuxは主にRHEL(CentOS)を使用してますが基本どのディストリビューションのbash使いでも同じはず。 別の機会にWSL2の有効的な使い方、みたいなものも触れてみたい。 目次 おまじない系 実行スクリプト名の取得 実行ディレクトリ名の取得 プロセスID ウェイトをかける 関数の書き方 遅延展開のさせ方 制御文 IF分岐の書き方 繰り返し処理の書き方 おまじない系 おまじない系/実行スクリプト名の取得 ◇Bashの場合 basename.sh #!/bin/bash _LNAME=$(basename "$0") echo "$_LNAME"; (実行結果) basename.sh ◇Windows/コマンドスクリプトの場合 basename.cmd @echo off setlocal enabledelayedexpansion set _LNAME=%~nx0 echo.%_LNAME% (実行結果) basename.cmd ◇Windows/PowerShellの場合 basename.ps1 echo $MyInvocation.MyCommand.Name (実行結果) basename.ps1 おまじない系/実行ディレクトリ名の取得 ◇Bashの場合 current_dir.sh #!/bin/bash _LNAME=$(dirname "$0") echo "$_LNAME"; (実行結果) /usr/local/src ◇Windows/コマンドスクリプトの場合 current_dir.cmd @echo off setlocal enabledelayedexpansion set _LNAME=%~dp0 echo.%_LNAME% (実行結果) C:\Users\hoge\My Test\ 注意点はコマンドスクリプトの場合、末尾に\がつく点 嫌なら以下のように末尾を1文字削る。 current_dir.cmd @echo off setlocal enabledelayedexpansion set _LNAME=%~dp0 set _LNAME=%_LNAME:~0,-1%   ←先頭から文字長-1きりとる、という意味 echo.%_LNAME% (実行結果) C:\Users\hoge\My Test ◇Windows/PowerShellの場合 current_dir.ps1 echo $(Split-Path $MyInvocation.MyCommand.Path -Parent) (実行結果) C:\Users\xxx\PowerShell プロセスIDの取得方法 ◇Bashの場合 process_id.sh echo $$ sleep 30 (実行結果) 121 ◇Windows/コマンドスクリプトの場合 コマンドスクリプトの場合は、実行しているスクリプトファイルのプロセスIDは取得できない (コマンドプロンプトのcmd.exeのプロセスIDまでしか取得できない)。 ◇Windows/PowerShellの場合 ウェイトをかける ◇Bashの場合 wait_cmd.sh sleep 5 ◇Windows/コマンドスクリプトの場合 wait_cmd.cmd timeout 5 >NUL ◇Windows/PowerShellの場合 関数の書き方 ◇Bashの場合 function any_function () { echo "test $1"; } any_function "test" (実行結果) test test ◇Windows/コマンドスクリプトの場合 goto MAIN :FUNCTIONS :DO_MY_FUNC echo.%1 exit /b :MAIN call :DO_MY_FUNC test (実行結果) test ◇Windows/PowerShellの場合 遅延展開のさせ方 ◇Bashの場合 ◇Windows/コマンドスクリプトの場合 ◇Windows/PowerShellの場合 制御文 制御文/IF分岐の書き方 ◇Bashの場合 if [ -f "/var/log/messages" ]; then ls -lah /var/log/messages; else : fi ◇Windows/コマンドスクリプトの場合 if exists xxx ( echo.xxx ) else ( echo.yyy ) 注意点 if ~ else ~ が全て1ステートメントとなっておりこの1ステートメントを評価した瞬間の環境変数が展開された状態で実行されるため、 ifやelseブロック内で、戻り値を受け取って環境変数として参照しようとしても参照できない。 制御文/繰り返し処理の書き方

Viewing all articles
Browse latest Browse all 2722

Trending Articles