シェルスクリプトで変数の先頭・末尾のtrim処理いろいろ
ユーザの入力情報を取り扱うときには、誤ってスペースを入力されたことを考慮した対策が必要です。
入力情報を変数に代入していた場合は先頭・末尾のtrim処理を行っておくと良いです。
Bashシェルスクリプトでtrimを実行する方法はいくつかあるので取り上げてみました。
Contents
前提
入力情報は INPUT
という変数に格納しておきます。
$ INPUT=' genzouw postit '
# スペースがあることがわかるようにカッコを付与しています
$ echo "[${INPUT}]"
[ genzouw postit ]
変数の前後から不要なスペースを除去し、以下のように出力されるようにしたいと思います。
[genzouw postit]
trimの方法1:sed
僕の中ではセオリー。
余談ですが、 sed
が使えると head
や tail
や tr
も代用できるし非常に便利です。万能ナイフ。
$ echo "${INPUT}" | sed 's/^ *\| *$//'
genzouw postit
変数に代入して使うこともできます。
$ X="$(echo "${INPUT}" | sed 's/^ *\| *$//')"
$ echo "${X}"
genzouw postit
trimの方法2:単純にechoする
ただechoに食わせるだけ。
$ echo ${INPUT}
genzouw postit
簡単でよいが、問題はあります。
中央部分のスペースが1つにマージされてしまいます。
$ INPUT2=" xxx yyy "
$ echo ${INPUT2}
xxx yyy
trimの方法3:xargsに食わせる
実は、 方法2 と大きな違いはない。
$ echo "${INPUT}" | xargs echo
genzouw postit
trimの方法4:Bash組み込みの変数参照機能を使う
Bashの組み込み機能として、変数参照時に先頭あるいは末尾から特定の文字を除去する機能があります。
ただし、1スペースずつしか除外できません。
# 末尾から2スペースを除去
$ X="${INPUT% }"
$ X="${X% }"
# 先頭から1スペースを除去
$ echo "${X# }"
genzouw postit
前後以外にスペースがない状況であればいっそすべて置換してしまうという方法も取れます。
# 間にスペースがなければよいのだが。。。
$ echo "${INPUT// /}"
[genzouwpostit]
trimの方法5 : tr
こちらも、文字列の内側にスペースがないという前提があれば利用できる方法です。tr
コマンドを使います。
# 間にスペースがなければよいのだが。。。
$ echo "${INPUT}" | tr -d ' '
genzouwpostit
ひとこと
万能なのは sed
ではないでしょうか。
ディスカッション
コメント一覧
まだ、コメントがありません