bash シェルでは、ドル記号の後に変数名を使用すると、シェルは変数をその値で展開します。シェルのこの機能は、パラメーター展開と呼ばれます。
ただし、パラメーターの展開には、パラメーターを展開して値を変更したり、展開プロセスで他の値を置き換えたりできる他の形式が多数あります。この記事では、文字列操作操作にパラメーター展開の概念を使用する方法を確認しましょう。
この記事は、進行中の bash チュートリアル シリーズの一部です。 bash { } 拡張に関する以前の記事を参照してください。
1. Bash シェル スクリプト内の文字列の長さを特定する
${#string}
上記の形式は、指定された bash 変数の長さを取得するために使用されます。
$ cat len.sh #! /bin/bash var="Welcome to the geekstuff" echo ${#var} $ ./len.sh 24
bash 変数の詳細については、6 つの実用的な Bash グローバルおよびローカル変数の例を参照してください。
2. Bash シェル スクリプト内の変数から部分文字列を抽出する
Bash は、文字列から部分文字列を抽出する方法を提供します。次の例は、特定の位置から始まる n 文字を解析する方法を説明しています。
${string:position}
$string から $position の部分文字列を抽出
${string:position:length}
$string から $position から始まる $length の文字部分文字列を抽出します。以下の例では、最初の echo ステートメントが 15 番目の位置から始まる部分文字列を返します。 2 番目の echo ステートメントは、15 番目の位置から始まる 4 文字を返します。長さは 0 以上の数値でなければなりません。
$ cat substr.sh #! /bin/bash var="Welcome to the geekstuff" echo ${var:15} echo ${var:15:4} $ ./substr.sh geekstuff geek
また、$*、$@、$#、$$、$!、$?、$-、$_ bash 特殊パラメーターの詳細については、以前の記事を参照してください。
3.部分文字列の最短一致
次の構文は、$substring の最短一致を $string の前から削除します
${string#substring}
次の構文は、$substring の最短一致を $string の後ろから削除します
${string%substring}
次のサンプル シェル スクリプトでは、上記の 2 つの最短部分文字列一致の概念について説明します。
$ cat shortest.sh #! /bin/bash filename="bash.string.txt" echo ${filename#*.} echo ${filename%.*} $ ./shortest.sh After deletion of shortest match from front: string.txt After deletion of shortest match from back: bash.string
最初の echo ステートメントでは、部分文字列「*.」が文字とドットに一致し、文字列の先頭から # が削除されるため、部分文字列「bash.」が削除されます。 filename という変数から。 2 番目の echo ステートメントで部分文字列 ‘.*’ は、ドットで始まる部分文字列と一致し、% は文字列の後ろから削除されるため、部分文字列 ‘.txt’ が削除されます。
4.部分文字列の最長一致
次の構文は、$substring の最長一致を $string の前から削除します
${string##substring}
次の構文は、$string の後ろから $substring の最長一致を削除します
${string%%substring}
次のサンプル シェル スクリプトでは、上記の 2 つの最長部分文字列一致の概念について説明します。
$ cat longest.sh #! /bin/bash filename="bash.string.txt" echo "After deletion of longest match from front:" ${filename##*.} echo "After deletion of longest match from back:" ${filename%%.*} $ ./longest.sh After deletion of longest match from front: txt After deletion of longest match from back: bash
上記の例では、##*. 「bash.string.」に一致する「*.」の最長一致を取り除きます。これをストライピングした後、残りのtxtを出力します。そして %%.* は、「.string.txt」に一致する .* の最長一致を後方から除去し、除去後に「bash」を返します。
5. Bash シェル スクリプト内の文字列値の検索と置換
最初の一致のみを置換
${string/pattern/replacement}
変数 $string のパターンに一致し、パターンの最初の一致のみを置換で置き換えます。
$ cat firstmatch.sh #! /bin/bash filename="bash.string.txt" echo "After Replacement:" ${filename/str*./operations.} $ ./firstmatch.sh After Replacement: bash.operations.txt
すべての一致を置換
${string//pattern/replacement}
pattern のすべての一致を置換で置き換えます。
$ cat allmatch.sh #! /bin/bash filename="Path of the bash is /bin/bash" echo "After Replacement:" ${filename//bash/sh} $ ./allmatch.sh After Replacement: Path of the sh is /bin/sh
検索と置換については、以前の記事 (sed 置換の例と Vim の検索と置換) を参照してください。
先頭と末尾を置き換える
${string/#pattern/replacement}
次の構文は、パターンが $string の先頭に一致する場合にのみ、置換文字列に置き換えられます。
${string/%pattern/replacement}
次の構文は、指定された $string の末尾でパターンが一致する場合にのみ、置換文字列に置き換えられます。
$ cat posmatch.sh #! /bin/bash filename="/root/admin/monitoring/process.sh" echo "Replaced at the beginning:" ${filename/#\/root/\/tmp} echo "Replaced at the end": ${filename/%.*/.ksh} $ ./posmatch.sh Replaced at the beginning: /tmp/admin/monitoring/process.sh Replaced at the end: /root/admin/monitoring/process.ksh
推奨読書
Bash 101 ハック、Ramesh Natarajan 著 .私はほとんどの時間を Linux 環境に費やしています。だから当然、私は Bash のコマンド ラインとシェル スクリプトの大ファンです。 15 年前、さまざまな種類の *nix に取り組んでいたとき、C シェルと Korn シェルで多くのコードを記述していました。後年、システム管理者として Linux の作業を開始したとき、Bash シェル スクリプトを使用して、考えられるすべてのタスクをほぼ自動化しました。私の Bash での経験に基づいて、Bash コマンド ラインとシェル スクリプトの両方に関する 101 の実用的な例を含む Bash 101 Hacks eBook を作成しました。 Bash の習得を考えている場合は、ぜひこの本を読んでください。Bash のコマンド ラインとシェル スクリプトを制御するのに役立ちます。