
「domain.com」以外の URL のすべての部分を削除するスクリプトを作成しています。ほとんどの部分を削除できましたが、サブフォルダで問題が発生しています。これが私のコードです:
domain=$1
inp="${domain//http:'//'}"
inp="${inp//https:'//'}"
inp="${inp//www.}"
inp="${inp%/*}"
問題は、切り取りたいサブフォルダごとに、別の「inp="${inp%/*}"」ルールを作成する必要があることです。現在、上記のコードは 1 レベルしか切り取ることができず、「www.google.com/hello」では機能しますが、www.google.com/hello/there では機能しません。これを考慮して 2 つのルールを追加することもできますが、すべてを考慮するためにルールを 20 回繰り返す必要はありません。
これをループに入れて、完了したことを検出する方法、またはこれを行うより良い方法はありますか?
答え1
代わりに
inp="${inp%/*}"
試す:
inp="${inp%%/*}"
これらのシェル置換は両方とも、接尾辞の削除フォーム%
は最短対応する接尾辞を削除します。対照的に、この%%
形式では最長一致するサフィックス。したがって、最初の部分/
とそれ以降のすべてを削除する場合は、 を使用します%%/*
。
ドキュメンテーション
からman bash
:
${パラメータ%単語}
${パラメータ%単語}
一致するサフィックスパターンを削除します。 ワードは、パス名展開の場合と同様に、パターンを生成するために展開されます。パターンが、展開されたパラメータの値の末尾部分に一致する場合、展開の結果は、最短一致パターン (case%
) または最長一致パターン (%%
case) が削除された、パラメータの展開された値になります。パラメータが @ または * の場合、パターン削除操作は各位置パラメータに順番に適用され、展開は結果のリストになります。パラメータが @ または * で添え字付けされた配列変数の場合、パターン削除操作は配列の各メンバーに順番に適用され、展開は結果のリストになります。