シェルスクリプトにおけるifの複数条件

表題の通り。たまに忘れるのでメモ。

■ 環境

  • Linux

■ if

自身は下記のように書いている。例えば”${KEY}“変数が空である場合。

if [ -z "${KEY}" ] ; then
  :
fi

■ AND

${KEY1}“と”${KEY2}“がともに空である場合。

if [ -z "${KEY1}" -a -z "${KEY2}" ] ; then
  :
fi

■ OR

${KEY1}“と”${KEY2}“のどちらか一方でも空である場合。

if [ -z "${KEY1}" -o -z "${KEY2}" ] ; then
  :
fi

以上。

標準エラー出力を標準出力へ

表題の通り。ちょっとした小技のメモ。たいしたことはない。

■ 環境

  • Linux

■ 状況

下記のようなことをやりたかった。

$ nginx -V | grep --color=auto security
nginx version: nginx/1.10.0 (Ubuntu)
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads
$

security“という文字列を探したかったのであるが、見つからない?そもそも全行が出力されている?というところで気がついた。標準エラー出力に出ているのか。そのせいで`grep`が効いていないのだな、と。というわけで下記で実施。

$ nginx -V 2>&1 | grep --color=auto security
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads
$

これで目的の文字列である”security“が赤文字で目立つように表示された。満足である。

以上。

less +F

知らなかったので表題をメモしておく。

■ 環境

  • Amazon Linux

■ tail -f / tailf / less +F

似たようなことをこれらのコマンドで実現できる。前に`tailf`の方が性能(?)メモリ使用量(?)的に良いとかって話を聞いた記憶があって`tailf`を使うようにしていたのだが、`less`でも同じようにできるということで、こっちを使うようになった。

$ less test.log

通常通りに`less`で、随時追記されるファイルを開いても良い。この後`Shift + F`で追記された分を追うこともできる。また`Ctrl + C`で通常のモードにも戻れるので便利である。

ちなみに`tail -F`というオプションもあるが、”logrotate“等でファイル名が変わっても、指定したファイル名を追随してくれるオプションである。日付が変わるタイミング等で変更することが多いので、あまり役立ったことはない。

以上。

tac

表題のコマンドについて。単なるメモ。

■ 環境

  • Amazon Linux

■ tac

下記のようなテキストファイルがあるとする。

$ cat test.txt
1 apple
2 grape
3 peach
4 kiwi
5 cherry
$

このテキストファイルに対して`tac`コマンドは下記のような結果を得られる。

$ tac test.txt
5 cherry
4 kiwi
3 peach
2 grape
1 apple
$

`tac`コマンドの名の通り、逆順に内容を`cat`してくれる。

さてこのコマンドはどのパッケージに入っているのか。

$ which tac
/usr/bin/tac
$
$ rpm -qf /usr/bin/tac
coreutils-8.22-15.52.amzn1.x86_64
$

そんなに使用頻度の高いものなのだろうか…。自身ではほぼ使ったことがない。

以上。

Slack Module

初めてのAnsible』を読んで知った表題のModuleを試してみた。

■ 環境

  • Ansible 2.2.1.0

■ Slack Module

Slack – Send Slack notifications – Ansible Documentation
http://docs.ansible.com/ansible/slack_module.html

よくわからなかったのが”token“のところである。

Custom Integrations
https://my.slack.com/apps/manage/custom-integrations

Incoming WebHooks“から作成もしくは既存のものの詳細に記載されている”Webhook URL“から抽出した。自身の環境ではマスクしているが下記のようなURLであった。

https://hooks.slack.com/services/X0X00XX0X/X0XX0XXXX/XXxxxXxXxxxxxxX0x0xxXxxX

https://hooks.slack.com/services/“以降の文字列を”token“に指定したところ、正しく通知された。

icon_emoji“や”username“も指定できるので、playbookが正常に終了した場合にSlackに通知するといったことができるようになった。

    - name: slack notification
      slack:
        token: "X0X00XX0X/X0XX0XXXX/XXxxxXxXxxxxxxX0x0xxXxxX"
        channel: "#test"
        username: "withsin"
        icon_emoji: ":withsin:"
        msg: "テスト。"
      become: no
      delegate_to: localhost

以上。

■ 関連