Shell/Linux
PR

シェルスクリプトで文字列操作(文字数、抜き出し、ヒアドキュメント)

saratogax
記事内に商品プロモーションを含む場合があります

これまでシェルスクリプトを利用する際には、複数のコマンドを実行して処理を自動化するために使う機会が多かったです。

今回は新たに文字列を制御するケースに遭遇したので、その内容を備忘録として残しておきたいと思います。

文字列の長さを算出する

まず、変数に入っている文字列の長さを算出するには以下のように表現します。

#!/bin/sh

KUMA="ABCDE"
echo "LENGTH : ${#KUMA}"

実行結果は以下の通り。

LENGTH : 5

上記の通り、文字列 ABCDE は 5 文字なので、長さも 5 と表示されます。

変数を読み出す際にシャープ(#)を付けるだけです。

ABCDE のような半角英数字では「文字数 = バイト数」になるため 5 と表示されますが、日本語などのマルチバイト文字を含む場合は、シェルやロケールの設定によって結果が変わることがあります。

文字列の抜き出し

次に、文字列の特定の部分だけを表示してみます。

Java だと String クラスの substring、PHP だと substr(mb_substr)と同じです。

# 5文字とも表示
$ echo "ABCDE" | cut -c 1-5
ABCDE

# 1から3文字目まで表示
$ echo "ABCDE" | cut -c 1-3
ABC

この cut と変数の文字列の長さを利用すればシェルスクリプト内でも文字列の一部を制御できそうです。

試しに、特定の文字列から最後の 1 文字を除去した文字列を表示してみます。

#!/bin/sh

KUMA="ABCDE"
LN=`echo $((${#KUMA} - 1))`
WORD=`echo ${KUMA} | cut -c 1-${LN}`

echo ${WORD};

結果は以下の通り。

ABCD

パラメータ展開で部分文字列を取り出す

先ほどは cut を使いましたが、bash や zsh では外部コマンドを使わず、パラメータ展開だけで部分文字列を取り出せます。

書式は ${変数:開始位置:長さ} で、開始位置は 0 から数えます。

$ KUMA="ABCDE"

# 先頭から3文字(0文字目から3文字ぶん)
$ echo "${KUMA:0:3}"
ABC

# 3文字目以降をすべて
$ echo "${KUMA:2}"
CDE

cut のようにパイプを挟まない分、スクリプト内ではこちらの方が手軽ですね。

また「末尾の1文字だけ削る」といった用途には、専用の書き方が用意されています。

$ KUMA="ABCDE"

# 末尾の1文字を削除
$ echo "${KUMA%?}"
ABCD

# 先頭の1文字を削除
$ echo "${KUMA#?}"
BCDE

先ほど cut と長さ計算で書いた「最後の1文字を除去」も、${KUMA%?} ならこの1行で済みます。

ヒアドキュメント

シェル(Shell)でヒアドキュメントを使うと、まとめて文章や文字列が表示できて便利です。

mail の body 出力として過去によく利用していましたが、ファイル出力は echo ばかり使っていたような気がします。

ヒアドキュメントで表現した内容をファイルに標準出力する方法を紹介します。

#!/bin/sh

# echo を使うパターン
echo "AAA" >> test1.txt
echo "BBB" >> test1.txt

# ヒアドキュメントを使うパターン
cat <<SETUP >> test2.txt
AAA
BBB
SETUP

ヒアドキュメントは区切り文字の書き方によって、中の変数やコマンドを「展開する/しない」を制御できます。詳しくはこちらの記事でまとめています。

あわせて読みたい
シェルスクリプトのヒアドキュメントの中で変数やコマンドを展開しない
シェルスクリプトのヒアドキュメントの中で変数やコマンドを展開しない

取り出した文字列を JSON として扱いたい場合は、jq でループしながら中身を取り出す方法が便利です。

あわせて読みたい
シェルスクリプトとjqコマンドでJSONをループして中身を取り出す
シェルスクリプトとjqコマンドでJSONをループして中身を取り出す
ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました