シェル芸160本ノック解答例 その2
技術評論社から出版された『1日1問、半年以内に習得 シェル・ワンライナー160本ノック』の解答例です。
- 解答例の範囲: 問題11〜問題20
- 前回の解答例: シェル芸160本ノック解答例 その1
問題11
$ sed -z 's/すず\n/鈴木:/g;s/さと\n/佐藤:/g;s/やま\n/山田:/g' gijiroku.txt
鈴木:あばばあばば
佐藤:あばばばばばばば!
山田:びっくりするほどユートピア!びっくりするほどユートピア!
鈴木:うひょひょひょwwwwwやまwwやまwww
佐藤:ひょおお?ひょおお???
鈴木:それでは会議を終わります
問題12
解答例のシェルスクリプトdouble.bash
です。
#!/bin/bash
n=$1
[ "$n" = "" ] && read -r n
echo $((n*2))
出力例は次の通りです。
$ bash double.bash 5
10
$ echo 3 | bash double.bash
6
$ echo 3 | bash double.bash 5
10
問題13
$ [ -e unfile ] || touch unfile
問題14
$ i=1; while [ $i -le 100 ]; do echo "羊が$i匹"; i=$((++i)); sleep 1; done
羊が1匹
羊が2匹
羊が3匹
(...略...)
羊が98匹
羊が99匹
羊が100匹
# `perl`を使った別解
$ perl -E 'while($n<100){say "羊が".++$n."匹";sleep 1}'
羊が1匹
羊が2匹
羊が3匹
(...略...)
羊が98匹
羊が99匹
羊が100匹
問題15
問題15小問1
$ echo I am a perfect human | (read in; echo ${in^^})
I AM A PERFECT HUMAN
問題15小問2
$ echo pen-pineapple-apple-pen | (read in; in=${in^}; in=${in//-p/-P}; echo ${in//-a/-A})
Pen-Pineapple-Apple-Pen
問題16
$ n="XYZ"; (for i in {A..C}; do n+=$i; echo $n; done); echo $n
XYZA
XYZAB
XYZABC
XYZ
問題17
$ echo "$(< /etc/passwd)" > ~/a
コピーできているか確認します。
$ diff -s /etc/passwd ~/a
ファイル /etc/passwd と /home/mitsuhisa/a は同一です
問題18
$ declare -A a; while read l; do a[${l##*:}]=$((++a[${l##*:}])); done < /etc/passwd; for k in ${!a[@]}; do echo $k ${a[$k]}; done; unset a
/bin/bash 3
/bin/sync 1
/usr/sbin/nologin 18
/bin/sh 1
/bin/false 23
なお、ログインシェルの名前と、これに対応する数は実行環境により異なります。
問題19
# ワンライナー実行前:
$ cat cardno
1234-5678-9012-3456
# 解答例のワンライナーを実行:
# `1<> cardno`で、ファイル`cardno`を標準出力(ファイル記述子1番)で読み書きするために開く
$ printf xxxx-xxxx 1<> cardno
# ワンライナー実行後:
$ cat cardno
xxxx-xxxx-9012-3456
問題20
$ (cd /usr; d=$(echo *); echo "${d// /$'\n'}")
bin
games
include
lib
libexec
local
sbin
share
src
Written on October 15, 2022