ウェブサイト検索

Bash文字列操作


文字列操作は、bashスクリプトの基本的な概念の一つです。プログラミングにおいて、文字列は文字の順序付きシーケンスであるデータ型の一つです。bashで文字列を作成し操作する方法を知っていることは重要です。このガイドでは、簡単な例を用いてBashシェルスクリプティングにおける文字列操作を学びます。この記事の最後には、bashの文字列を自在に扱えるようになるでしょう。

変数の代入

文字列は変数に代入して後でスクリプト内でさらに処理するために使用できます。例えば、私は "GREET_USER" という名前の変数を作成して、その文字列をターミナルに出力しています。

$ GREET_USER="Hello, Thanks for visiting OSTechnix"
$ echo "$GREET_USER"

変数に文字列を代入する

Bashには強い型システムはないため、変数に値を割り当てると文字列型として扱われます。文字列はシングルクォート、ダブルクォート、またはクォートなしで作成できます。

bashでは、シングルクォートとダブルクォートには違いがあります。シングルクォートは変数やコマンドの展開を防ぎますが、ダブルクォートはそれをサポートします。以下の例を見てみましょう。

私は別の変数 "SITE_NAME" を作成しました。そして、それは "GREET_USER" 変数で使用されます。ダブルクオートでは変数は展開され、シングルクオートでは変数は展開されません。

$ SITE_NAME="OSTechnix"
## DOUBLE QUOTES

$ GREET_USER="Hello, Thanks for visiting ${SITE_NAME}"
$ echo "$GREET_USER"

二重引用符の使用
# SINGLE QUOTES
$ GREET_USER='Hello, Thanks for visiting ${SITE_NAME}'
$ echo "$GREET_USER"

シングルクォートの使用

文字列の長さ

文字列の長さを求めるには、# 記号を使うことができます。文字列の長さを求めることは、文字列の数に基づいて何らかのロジックを書く必要がある場合に役立ちます。

$ echo "${#SITE_NAME}"

文字列の長さ

文字列を配列に変換する

文字列データ型を配列型に変換する方法はいくつもあります。最も簡単な方法は、文字列を中括弧で囲むことです。

$ ARR_TYPE=($GREET_USER)
$ echo ${ARR_TYPE[@]}
$ for element in ${ARR_TYPE[@]}; do
  echo $element
done

文字列を配列に

2つ目の方法は、文字列を分割し、文字列で使用されている区切り文字に基づいて配列として保存することです。前の例では、スペースがフィールドセパレーター(IFS)として使用されており、これはbashでのデフォルトのIFSです。例えば、カンマ区切りの文字列がある場合、IFSをカンマに設定して配列を作成することができます。IFSの詳細については、次のガイドを参照してください。

  • Bashスクリプト – WhileループとUntilループの例を用いた解説
$ STR_TO_ARR="column1,column2,column3"
$ IFS=","
$ ARR=(${STR_TO_ARR})
$ for element in ${ARR[@]}; do echo $element; done
$ echo "${ARR[@]}"

カスタムIFS - 配列変換

文字の変換

Bashには文字列の大文字小文字変換をサポートする組み込み機能があります。以下に示すように、文字列の末尾に特定の文字を使って大文字小文字を変換する必要があります。

# SPECIAL CHARACTERS

,, ==> Converts an entire string to lowercase
^^ ==> Converts an entire string to Uppercase
~~ ==> Transpose Case
,  ==> Converts first letter alone to lowercase
^  ==> Converts first letter alone to uppercase
# ---- LOWER TO UPPER CASE ----
$ L_TO_U="welcome to ostechnix"
$ echo ${L_TO_U^^}


# ---- UPPER TO LOWER CASE ----
$ U_TO_L="WELCOME TO OSTECHNIX"
$ echo ${L_TO_U,,}


# ---- TRANSPOSE CASE ----
$ TRS_CASE="Welcome To OsTechnix"
$ echo ${TRS_CASE~~}


# ---- FIRST LETTER TO LOWERCASE ----
$ F_TO_L="OSTECHNIX"
$ echo ${F_TO_L,}


# ---- FIRST LETTER TO UPPERCASE ----
$ F_TO_U="ostechnix"
$ echo ${F_TO_U^}

文字の変換

正規表現パターンマッチングを使用して、マッチした部分の大文字小文字を変換することもできます。

$ L_TO_U="welcome to ostechnix"
$ echo ${L_TO_U^^[toe]}

正規表現パターンマッチング - 大文字小文字の変換

文字列の連結

複数の文字列を一つずつ並べて配置することで連結することができます。文字列の連結の方法によっては、追加の文字を加えることもできます。

$ SITE_NAME="OSTechnix"
$ MESSAGE="Welcome to"
$ echo "${MESSAGE} {SITE_NAME}"

文字列の連結

文字列のスライス

文字列のスライスは、インデックスの位置を使って文字列の一部を抽出する方法です。文字列の各文字には整数の値が割り当てられており、それを使って文字列の一部を取得することができます。インデックス値は0からNまでの範囲です。以下はスライスの構文です。

{STRING:START:LENGTH}

START => Starting Index Position
LENGTH => Length of the String from position START

もし LENGTH が指定されていない場合、文字列はインデックス位置 START から最後まで印刷されます。

$ SITE_NAME="OSTechnix"
$ echo ${SITE_NAME:2}

スライス - 開始から終了まで

LENGTH が指定されると、START のインデックス位置から部分文字列を出力し、何文字を出力するかを示します。

$ echo ${SITE_NAME:2:2}

スライス - 開始位置と長さ

文字列を逆にする方法はいくつもあります。最も簡単な方法は rev コマンドを使用することです。外部コマンドを使わずに bash でこれを行いたい場合は、手動でロジックを書く必要があります。

$ echo ${SITE_NAME} | rev

文字列を反転する

検索と置換

外部コマンドのような sed や awk を使わずに、文字列内の文字を検索して置換するネイティブな方法があります。

サブ文字列の最初の出現を置き換えるには、次の構文を使用します。

{STRING/X/Y}
The first occurrence of X will be replaced by Y.

以下の例を見てみましょう。ここでは、単語 "linux" の最初の出現が大文字の LINUX に置き換えられています。

$ MESSAGE="linux is awesome to work with.
Ubuntu is one of the powerful linux distribution"
$ echo $MESSAGE
$ echo ${MESSAGE/linux/LINUX}

最初の出現を置き換える

その単語のすべての出現箇所を置き換えるには、次の構文を使用します。

$ echo ${MESSAGE//linux/LINUX}

すべての出現箇所を置き換える

サブ文字列を削除

文字列から部分文字列を削除する方法はいくつかあります。sed、awk、または tr のような外部ユーティリティを使用することもできますし、bashのネイティブな方法で行う方法もあります。

Bashのネイティブな方法では、パラメータ展開を使用して部分文字列を削除します。削除するパターンに続けて%記号を使用する必要があります。これにより、最後に見つかったパターンと一致し、それが削除されます。

例えば、ピリオド(.)の後に続く単語を削除したい場合、次の構文を使用する必要があります。ここでは、ピリオド(.)の後に続くものはすべて削除されます。この場合、最後に一致したパターン .com が削除されます。

$ SITE_NAME="www.ostechnix.com"
$ echo ${SITE_NAME%.*}

%記号を使用して部分文字列を削除する

パターンの最初の出現に一致させるには、二重パーセント記号を使用します

$ SITE_NAME="www.ostechnix.com"
$ echo ${SITE_NAME%%.*}

%%記号を使って部分文字列を削除する

また、# または ## 記号を使用することもできます。これはある種の逆削除を行います。単一の # 記号を使用すると、最初のパターンが一致し、パターンの前のすべてが削除されます。

$ SITE_NAME="www.ostechnix.com"
$ echo ${SITE_NAME#*.}

#記号を使って部分文字列を削除する

ダブルの##記号を使うと、最後のパターンが一致し、パターンの前のすべてが削除されます。

$ SITE_NAME="www.ostechnix.com"
$ echo ${SITE_NAME##*.}

##記号を使って部分文字列を削除する

結論

この記事では、bashで文字列を作成する方法と、文字列を操作するさまざまな方法について見てきました。bashの文字列操作に慣れるために、ターミナルを起動し、このガイドで提供された例を練習してください。ご意見やご質問がある場合は、下のコメント欄をご利用ください。

Bashスクリプトガイド:

  • Bashスクリプト – printfコマンドの例を用いた説明
  • バッシュスクリプト – 添字付き配列を例で解説
  • Bashスクリプト – 連想配列を例で解説
  • バッシュスクリプト – forループを例付きで解説
  • Bashリダイレクションの例付き解説
  • Bashスクリプト – 変数の説明と例
  • Bashスクリプト – 関数の説明と例
  • LinuxにおけるBashのechoコマンドの説明と例
  • 初心者のためのBashヒアドキュメントチュートリアル