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

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


問題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