DOSバッチファイル: コマンドの出力を変数に格納(代入)する

date /T の出力を変数 b に代入する。

@echo off

for /F "USEBACKQ" %%a in (`date /T`) do (
  echo a = %%a
  set foo=%%a
)

echo a = %%a
echo foo = %foo%

pause
結果:
>test.bat
a = 2009/05/25
a = %a
foo = 2009/05/25
続行するには何かキーを押してください . . .
2009/05/25

ksh / Korn shell メモ

if + 複数の条件

if [ 0 = 0 ] && [ 1 = 1 ] ; then 
  echo OK 
else 
  echo NG 
fi
#=> OK

if [ 0 = 0 ] && [ 1 = 2 ] ; then 
  echo OK 
else 
  echo NG
fi
#=> NG

ユーザに YES/NO を選択させる

choice="null"

while [ $choice = "null" ] ; do
  printf "Type yes/no: "
  read choice
  case $choice in
  yes)
    echo YES; break
    ;;
  no)
    echo NO; break
    ;;
  *)
    choice="null"
    ;;
  esac
done

先頭に0を付けると8進数扱いになる

$ printf "%d\n" 07
7
$ printf "%d\n" 08
printf: 3016-002 08 は完全には変換されませんでした。
0
$ printf "%d\n" 010
8
10進数として扱うために expr を使う。
$ echo `expr 08`
8
$ echo `expr 09`
9
$ echo `expr 10`
10

処理の開始・終了時刻を処理終了時に表示

$ start_time=`date`
$ ## 時間のかかる(複数の)処理
$ echo ${start_time} -- `date` #=> Mon Aug 24 12:00:00 JST 2009 -- Mon Aug 24 13:00:00 JST 2009

引数のチェック

if [ $1 ] ; then # $1 が存在すれば
  FOO=$1
else
  echo ARGV1 is essential
  exit 1
fi
if [ $1 = "aaa" ] || [ $1 = "bbb" ] ; then
  FOO=$1
else
  echo ARGV1 must be "aaa" or "bbb"
  exit 1
fi

ワンライナー + while

$ while true ; do tail foo.log ; sleep 10 ; done

整数の演算、桁の整形

引数に整数を受け取り、1を加算し、0 でパディングして 4桁にする。
x=`printf %04d $(($1+1))`
echo $x

コマンドの終了ステータスで処理分岐

#!/usr/bin/ksh

ls xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ## 終了ステータスを返すコマンド
status=$?

if [ $status = 0 ] ; then
  echo $status OK
else
  echo $status NG
fi
2009/01/06