文法

環境変数を読んでみる

2016年11月5日追記
コマンドライン引数を読んでみるでも書いたようにSwift3になってNSProcessInfoが使えなくなったので、Swift2でやっていたような辞書型配列によるシェル変数の取り出しができなくなりました。

Stack Overflowにgetenv()という関数を使う方法が紹介されていたので、こちらを使ってゆきます。

今更ながら時は21世紀。グローバルの時代。カレンダーも英語対応できなくては困ります。

Macのターミナルで日本語表示をするためには環境変数LANGを設定しているはず。ということで環境変数を読み込んで、その結果によって日英表示を切り替えてみます。ここで日本語文字コードには何種類かあるんですが、「いまどきUnicode以外ないでしょ!」ということでutf-8の場合のみを日本語環境とみなします。

#! /usr/bin/swift
import Foundation
// シェル変数名を指定すると値を返す関数
func getEnvironmentVar(name: String) -> String? {
	guard let rawValue = getenv(name) else { return nil }
	return String(utf8String: rawValue)
}
var message: String = "It is unclear whether it can display Japanese language or not."
if let env = getEnvironmentVar(name:"LANG") {
    if env == "ja_JP.UTF-8" {
        message = "utf-8による日本語表示可能環境です"
    }
}
print("\(message)")

環境変数情報はgetenv()関数により取り出すことができます。ここではgetenvを使って関数を定義しています。

5行目でgetenvに変数名を与え、実際に環境変数が存在すればその値を、存在しなければnilをrawValueに代入します。rawValueという名前からもわかるようにgetenvは文字列を謎の16進数で返してしまうので、6行目でrawValueの値をString()関数によってutf-8文字列に変換する必要があります。

10行目で環境変数LANGが設定されていて、かつその値がja_JP.UTF-8の場合のみ表示するメッセージを日本語に書き換えています。もしもLANGが設定されていなかったり、LANGの値が日本語のUnicodeでない場合には初期値の英語メッセージのままです。

$ printenv | grep -e "LANG"
LANG=ja_JP.UTF-8
$ ./chkenv.swift
utf-8による日本語表示可能環境です
$ LANG=
$ ./chkenv.swift
It is unclear whether it can display Japanese language or not.