文字列操作のテクニック

ShellBeginner
オンラインで実践に進む

はじめに

スクリプトを作成するとき、変数に格納されたテキストを変更する必要がよくあります。たとえば、ファイルパスの一部を抽出したり、設定値の単語を置き換えたり、ユーザーが値を指定しなかった場合でも変数に有効な値が入るようにしたりします。

Bash には、これらの処理に使える パラメータ展開 という強力な組み込み機能があります。

パラメータ展開を使うと、追加のコマンドを起動せずにテキストを変換できます。シェルスクリプトでは、小さな変更のたびに外部ユーティリティを呼び出すよりも、組み込み機能を使うほうが高速で簡潔なことがよくあります。

この実験では、次の 3 つの基本的な文字列操作テクニックを学びます。

  1. スライス:文字列から特定の部分を抽出します(例:最初の 5 文字)。
  2. 置換:文字列内のテキストを検索して置き換えます。
  3. デフォルト値:変数が未設定または空の場合に、代替値を自動的に割り当てます。

文字列変数を定義する

まず、長いファイルパスを格納する変数を作成します。この文字列を使って、文字列操作のテクニックを練習します。

シェルの作業では、文字列の処理がさまざまな場面で必要になります。パス、ユーザー名、ホスト名、設定値、コマンドの出力など、多くのシステム情報がテキストで表現されるためです。シェルから離れずにテキストを加工できるようになると、作業効率が大きく向上します。

string_lab.sh という新しいスクリプトを作成します。

string_lab.sh を開き、次のコードを追加します。

nano string_lab.sh
#!/bin/bash

## Define a variable with a file path
FILE_PATH="/usr/local/share/applications/config.xml"

echo "Original Path: $FILE_PATH"

保存(Ctrl+O、Enter)して終了(Ctrl+X)します。

実行可能にして実行し、環境を準備します。

chmod +x string_lab.sh
./string_lab.sh

完全なパスが表示されます。次に、この文字列を操作します。

部分文字列を抽出する(スライス)

文字列の最初の数文字など、特定の部分だけが必要になることがあります。これを スライス と呼びます。

スライスの構文は次のとおりです。

${Variable:Offset:Length}

  • Offset:開始位置です(0 が最初の文字を表します)。
  • Length:取得する文字数です。

これはパラメータ展開によって行われます。つまり、Bash がコマンドを実行する前に、変数の値を内部で変換します。単純な部分文字列の操作に cut などの追加ユーティリティは必要ありません。

FILE_PATH から最初の 5 文字(/usr/)を抽出します。

string_lab.sh を開きます。

nano string_lab.sh

ファイルの末尾に次のコードを追加します。

## Slicing: Start at index 0, take 5 characters
## Syntax: ${Variable : Start : Length}
SLICE=${FILE_PATH:0:5}

echo "First 5 characters: $SLICE"

保存して終了します。次のコマンドを実行します。

./string_lab.sh

結果:

First 5 characters: /usr/

Bash によって、文字列の先頭から正確に 5 文字が抽出されています。

部分文字列を置換する

このテクニックは、テキストエディターの「検索と置換」と同じように機能します。

構文は次のとおりです。

${Variable/Find/Replace}

ここでは、ファイルパス内のフォルダー share を bin に変更します。

string_lab.sh を開きます。

nano string_lab.sh

次のコードを追加します。

## Replacement: Find 'share', replace with 'bin'
## Syntax: ${Variable / Pattern / Replacement}
NEW_PATH=${FILE_PATH/share/bin}

echo "Modified Path: $NEW_PATH"

保存して終了します。次のコマンドを実行します。

./string_lab.sh

結果:

Modified Path: /usr/local/bin/applications/config.xml

シェルによって share の最初の出現箇所が検索され、bin に置き換えられています。

この方法は、パスの操作、ファイル名の整理、設定の簡単な変更などに便利です。Bash 内部で処理が完了するため、小規模な置換であれば、別のテキスト処理コマンドを起動するよりも軽量で読みやすいことが一般的です。

デフォルト値を指定する

スクリプトでは、入力値や USER、HOME などの環境変数を使用することがよくあります。これらの変数が存在しないと、スクリプトが停止したり、予期しない動作をしたりする可能性があります。

変数が未設定または空の場合に使用する デフォルト値 を指定できます。

構文は次のとおりです。

${Variable:-DefaultValue}

string_lab.sh を開きます。

nano string_lab.sh

次のコードを追加します。USER_NAME はスクリプト内で定義されていないため、現在は未設定です。

## Default Value: If USER_NAME is missing, use 'guest'
## Syntax: ${Variable :- Default}
CURRENT_USER=${USER_NAME:-guest}

echo "Current User: $CURRENT_USER"

保存して終了します。次のコマンドを実行します。

./string_lab.sh

結果:

Current User: guest

USER_NAME が定義されていないため、Bash は不足しているデータの代わりにフォールバック値 guest を使用しました。これにより、スクリプトを問題なく実行し続けられます。

このパターンは、環境変数やオプションの引数から入力を受け取る自動化処理で特に役立ちます。妥当なデフォルト値を設定すると、一部のデータが欠けている場合でも、スクリプトをより安全で予測しやすくできます。

まとめ

この実験では、パラメータ展開を使用して、Bash 内で直接文字列を操作する方法を学びました。

  1. スライス(${var:offset:length}):部分文字列を正確に抽出します。
  2. 置換(${var/old/new}):変数の内容を変更します。
  3. デフォルト値(${var:-default}):未設定の変数を適切に処理します。

これらのテクニックを使うと、単純な処理のために sed や awk などの外部ツールを使用せず、テキストを効率的に処理できる堅牢なスクリプトを作成できます。