シェルスクリプトで変数の先頭・末尾のtrim処理いろいろ

2023-02-15Bash,CentOS,Linux,Ubuntu

ユーザの入力情報を取り扱うときには、誤ってスペースを入力されたことを考慮した対策が必要です。
入力情報を変数に代入していた場合は先頭・末尾のtrim処理を行っておくと良いです。

Bashシェルスクリプトでtrimを実行する方法はいくつかあるので取り上げてみました。

前提

入力情報は INPUT という変数に格納しておきます。

$ INPUT=' genzouw postit  '
 # スペースがあることがわかるようにカッコを付与しています
$ echo "[${INPUT}]"
[ genzouw postit  ]

変数の前後から不要なスペースを除去し、以下のように出力されるようにしたいと思います。

[genzouw postit]

trimの方法1:sed

僕の中ではセオリー。

余談ですが、 sed が使えると headtailtr も代用できるし非常に便利です。万能ナイフ。

$ 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 ではないでしょうか。

2023-02-15Bash,CentOS,Linux,Ubuntu