3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

シェルスクリプトAdvent Calendar 2021

Day 1

LinuxでLinuCスピードマスター問題集を効率的(?)に勉強する方法

Last updated at Posted at 2021-11-30

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/にあります。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?