Bash
シェル芸

好きなカップは?

は?

これを質問された時、一瞬困惑しました。
意味を理解するのに30秒程掛かりました。

回答

結論は、

回答
echo $(echo A B C D E F G H | sed 's/ /\n/g' | sort -R | head -n1)カップ

としました。

ではこれを解剖し、意図を示しながら解説していきましょう。

解説

サブシェル

$(...)はサブシェルと言われ、...内のコマンドの結果を展開する構文です。
...に相当する文は、echo A B C D E F G H | sed 's/ /\n/g' | sort -R | head -n1ですね。

リダイレクト

全てのコマンドは|(パイプ)で連結されています。
これは、リダイレクトと言われ、パイプの前のコマンドの出力を、パイプの後の入力として渡す構文です。

初期データ

何かを表示、使用するには、それの元となるデータが必要なので、それを与えます。
初期データは、A~Hにしたかったのですが、seqのアルファベット版が無いような気がしたので、echosedで生成します。あったら教えて下さい。

まず、echo A B C D E F G Hでスペース区切りのA~Hを出力します。
次に、sed(文字列を置き換えるコマンド)でスペースを改行に変換します。
今回の変換(引数)はs/ /\n/gですね。
最初のs/はおまじないのようなものなので解説はしません。
次に、スペース一文字が続きますが、これは置き換え元を表します。ABCにすると、ABCを置き換えてね、となります。
次には/(スラッシュ)が来ます。これは、置き換え元と置き換え後の文字列の区切りとなります。
この後に続く\nは、改行を表します。改行は、これ以降のコマンドの区切りとして使われます。
最後の/gもまたおまじないのようなものです。/だけにすると最初のスペースになります。

データをいじる

ここまでで、改行区切りのA~Hが得られました。
これを、いじります。
sedの出力の送り先はsort -Rですね。
sortと聞くと、並び替えと思われますが、sort -Rは違います。1
順番をランダムにします。

つまり、sort -Rによって、何がどこにあるか分からなくなりました。

sort -Rの結果は、head -n1に渡されます。
headは入力からN行だけ持ってくる、という事ができます2
-n1によって行数が指定されており、スペースを省いているので分かりにくいですが、最初の1行を持ってきてね、と指示しています。

ここで、サブシェルの内容は終わりです。

出力

先程のサブシェルとechoで簡潔に。
ただし、カップを足すのを忘れずに。3

最終的にこのコマンドは、Aカップ...Hカップのいずれかをランダムで出力するものである事が分かります。

使用例



  1. sortそのままでは確かに昇順に並び替えてくれます。 

  2. headの逆はtailであり、これは末尾N行だけ持ってくることができます。 

  3. 引用符を付け、echo "$(...)カップ"としても良いと思います。