LinuxでLinuCスピードマスター問題集を早く勉強する方法です。
LinuC Lv1 102を受けようと思っていて、どの問題が正解でどの問題が不正解か、みたいなことを記録するプログラムです。
初期化(init.sh
)
必要なファイルを作成します。
#!/bin/bash
echo "Init..."
echo "Creating files..."
echo "-" > l
echo "0" > c
echo "0" > w
mkdir ans > /dev/null 2>&1
cat > start.sh << "EOF"
#!/bin/bash
echo "LinuC スピードマスター 問題集専用学習スクリプト by okaits"
echo "For Lv1 Ver10.0"
echo "前回学習したところ: $(cat l)"
echo "Init..."
C=0
c=0
w=0
sleep 0.8s
while true
do
read -p "問題番号(endで終了)> " m
if [ $m = "end" ]
then
echo "お疲れ様でした。"
echo "解いた問題数: $C"
echo "正答: $c"
echo "正答(累計): $(cat c)"
echo "誤答: $w"
echo "誤答(累計): $(cat w)"
exit 0
fi
echo "問題$mが選択されました。"
read -p "解答> " n
read -p "正誤(True or False)> " b
tC=$(($C + 1))
C=$tC
echo $m > l
case $b in
True) k="$(($(cat c) + 1))"
tc="$(($c + 1))"
c=$tc
echo $k > c
echo "OK, ans: $n" > ans/$m;;
False) k="$(($(cat w) + 1))"
tw="$(($w + 1))"
w=$tw
echo $k > w
echo $m > wronglist
echo "NO, ans: $n" > ans/$m;;
esac
done
EOF
chmod +x start.sh
ln -s $0 reset.sh
sleep 0.8s
echo "Done."
echo "Init Done."
メインスクリプト(start.sh
)(初期化の後に作成される)
初期化の後に作成されるメインスクリプトです。
#!/bin/bash
echo "LinuC スピードマスター 問題集専用学習スクリプト by okaits"
echo "For Lv1 Ver10.0"
echo "前回学習したところ: $(cat l)"
echo "Init..."
C=0
c=0
w=0
sleep 0.8s
while true
do
read -p "問題番号(endで終了)> " m
if [ $m = "end" ]
then
echo "お疲れ様でした。"
echo "解いた問題数: $C"
echo "正答: $c"
echo "正答(累計): $(cat c)"
echo "誤答: $w"
echo "誤答(累計): $(cat w)"
exit 0
fi
echo "問題$mが選択されました。"
read -p "解答> " n
read -p "正誤(True or False)> " b
tC=$(($C + 1))
C=$tC
echo $m > l
case $b in
True) k="$(($(cat c) + 1))"
tc="$(($c + 1))"
c=$tc
echo $k > c
echo "OK, ans: $n" > ans/$m;;
False) k="$(($(cat w) + 1))"
tw="$(($w + 1))"
w=$tw
echo $k > w
echo $m > wronglist
echo "NO, ans: $n" > ans/$m;;
esac
done
解説
分かりにくい所を説明します。
4行目 $(cat l)
4行目にある$(cat 1)
は、「cat l
を実行した結果を埋め込む」という意味で、l
には最後に解いた問題番号が記録されています。
6~8行目 変数定義
6~8行目は変数定義です。
C
が今回解いた問題の数、
c
が今回解いた問題の中の正答数、
w
が今回解いた問題の中の誤答数です。
26, 31行目 tc="$(($c + 1))
, tw="$(($w + 1))
c="$(($c + 1))"
やw="$(($w + 1))"
だとbashだと
1. `c`(または`w`)を初期化する 2. `$c + 1`を計算する 3. 計算結果をcに入れる
のように解釈されてしまいます。なので、これを回避するために遠回りしています。 # 使い方 1. `init.sh`を実行する(初回のみ) 2. `start.sh`を実行する
ちなみに、今まで解いた問題の答えはans/
にあります。