LoginSignup
1

More than 5 years have passed since last update.

Bash(awk)でHello World!を出力する。

Last updated at Posted at 2017-04-28

ただし文字・数値リテラルを使わずに

早速ソース

$ false;echo $? |
awk '{one=$0;zero=one-one;two=one+one;three=one+two;
four=one+three;seven=three+four;eight=seven+one;
nine=eight+one;print(seven two);print(one zero one);
print(one zero eight);print(one zero eight);
print(one one one);print(three two);print(one one nine);
print(one one one);print(one one four);
print(one zero eight);print(one zero zero);print(three three); }'|
awk '{printf("%c",$0)}END{printf("\n")}'

[実行結果]
Hello world!

何番煎じかわかりませんが、会社のSlackに気まぐれで貼ったら意外と受けが良かったので。
見やすいように適当に改行入れてます。

解説

false;echo $?
falseは終了コード1を返すコマンドです。
続けて実行しているecho $?で直前のコマンド(false)の終了コードを出力しています。


awk '{one=$0;zero=one-one;...print(three three); }'
echo $?の値が$0に入っているため、oneという変数に格納します。
コレで1を作ることが出来たので、1 - 1 = 01 + 1 = 2のようにしてどんどん数値を作っていきます。
また、print()では変数や文字列同士をスペースを挟むことで結合して出力できます。
例) print("1" "2") => 12
コレを用いて、先程作った数値から"Hello world!"の各文字に対応する文字コードを作っていきます。

H = 72
e = 101
l = 108
o = 111
= 32
w = 119
r = 114
d = 100
! = 33


awk '{printf("%c",$0)}END{printf("\n")}'

あとは、printf("%c",x)でxの文字コードに対応する文字を表示させます。
printf()print()と違って改行を出力しないため、最後に改行を出力します。

以上です。
もっと簡潔に書けるよ!とかあればよろしくお願いします。

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
1