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の世界 』がオススメです。