シェル芸160本ノック解答例 その3

技術評論社から出版された『1日1問、半年以内に習得 シェル・ワンライナー160本ノック』の解答例です。


問題21

$ echo dir_{a,b}/file_* dir_c/dir_*{,/dir_*}/file_* | tr ' ' '\n' | sort
dir_a/file_1
dir_a/file_2
dir_b/file_1
dir_b/file_2
dir_c/dir_b/dir_a/file_1
dir_c/dir_b/file_1
dir_c/dir_b/file_2

問題22

# ダミーのFQDNを100個生成
$ w(){ shuf /usr/share/dict/words | tr 'A-Z' 'a-z' | tail -n100; }; paste -d. <(w) <(w) <(for i in {1..20}; do echo com org {co,or,ne}.jp | tr ' ' '\n' | shuf; done)
frowzy.humulus.ne.jp
pediadontist.enteral.com
bonehead.forthrightness.or.jp
(...略...)
apocarpy.threnodic.com
anthraxylon.schizogenously.co.jp
reputed.sidler.org

問題23

# ロック状態を解除するためのプロセスIDが`5249`の場合:
$ kill -s CONT 5249

問題24

$ trap 'rm -f ~/tmp/{.,}*' EXIT

問題25

シェルスクリプトpipefail.bashの5行目を変更した解答例です。

#!/bin/bash -e
set -o pipefail
trap 'rm .tmp.top10' EXIT

sort | head > .tmp.top10 || true

echo "+++++TOP 10+++++"
cat .tmp.top10

5行目の末尾に|| trueを付け加えています。


問題26

$ echo "trap 'dh=\$(date '+%-H'); [ $dh -ge 18 -o $dh -lt 4 ] && echo 早く帰れ' CHLD" >> ~/.bashrc

問題27

$ while sleep 3 ; do date ; done
2022年 10月 18日 火曜日 03:18:03 JST
2022年 10月 18日 火曜日 03:18:06 JST
2022年 10月 18日 火曜日 03:18:09 JST
^C

# 解答例のワンライナーを実行:
# 簡易置換`^old^new^`で、直前のコマンドを3秒周期から1秒周期に変えて再実行
$ ^3^1^
while sleep 1 ; do date ; done
2022年 10月 18日 火曜日 03:18:16 JST
2022年 10月 18日 火曜日 03:18:17 JST
2022年 10月 18日 火曜日 03:18:18 JST
^C

問題28

# ワンライナー実行前:
$ ls
 -Rf   important_dir  '~'

# 解答例のワンライナーを実行:
$ rm -fR -- '-Rf' '~'

# ワンライナー実行後:
$ ls
important_dir

問題29

$ bash -n fb.bash |& awk -F '[: ]' 'NR==1{print $4}'
6

# `shellcheck``jq`を使った別解
$ shellcheck -f json fb.bash | jq '.[0].line'
6

問題30

$ declare +f -p | while read l; do [[ "$l" =~ \ BASH ]] && { v=${l#*-* }; echo ${v%%=*}; }; done
BASH
BASHOPTS
BASHPID
BASH_ALIASES
BASH_ARGC
BASH_ARGV
BASH_ARGV0
BASH_CMDS
BASH_COMMAND
BASH_COMPLETION_VERSINFO
BASH_LINENO
BASH_REMATCH
BASH_SOURCE
BASH_SUBSHELL
BASH_VERSINFO
BASH_VERSION
Written on October 18, 2022