シェルスクリプトの % (パーセント記号)の意味

Yahoo!知恵袋の回答受付中の質問に勝手に答えるコーナーです。

今回の質問は、

シェルスクリプトで、下記のような記述があるのですが、どういう意味でしょうか?

[root@Sakura ~]# cat /etc/ssh/sshrc
## SSHの環境変数より、CLIENTのIPを取得
## $ echo $SSH_CLIENT
## 192.168.132.1 48265 22
SOURCE_IP=${SSH_CLIENT%% *}

わからないのは、SOURCE_IP=${SSH_CLIENT%% *}の部分です。

%% *は何を意味しているのでしょうか?

回答

% は、その変数に代入されている文字列を後ろから切り取ります。

% の後に指定されたパターン、今回の場合は ” *” に一致した部分を切り取り、残った部分を返し、SOURCE_IP に代入します。

%% を指定した場合は、最長一致になります。

今、$SSH_CLIENT に “192.168.132.1 48265 22″ に入っている時、${SSH_CLIENT%% *} は後ろから ” *” に一致する文字列を探します。

” *” はスペースと任意の文字列を表すので、後ろからスペースを探していって最後に一致した 48265 の前のスペースまでを切り取り、”192.168.132.1″ を返します。

ちなみに、% が 1つの場合は最短一致になります。

${SSH_CLIENT% *} なら、22 の前のスペースまでを切り取り、”192.168.132.1 48265″ を返します。

シェルスクリプトの # (シャープ記号)の意味

# は、その変数に代入されている文字列を前から切り取ります。

つまり、${SSH_CLIENT# *} なら、192.168.132.1 の後ろのスペースまでを切り取り、”48265 22″ を返します。

# も 2つ重ねると最長一致になります。

${SSH_CLIENT## *} なら、48265 の後ろのスペースまでを切り取り、”22″ を返します。

まとめ

記述の意味がわからなく、それが記号の場合は検索しにくいですね。

基礎からしっかりと学んでいけば、通る知識なのですが。

# は、No. とも読み数字の前に付く記号なので前方一致、% は数字の後ろに付く記号なので後方一致、と覚えると覚えやすいです。

シェルスクリプトの学習は、『入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界 』がオススメです。