egrepを使用した変数のスクリプトの正規表現

egrepを使用した変数のスクリプトの正規表現

変数A_DESTINATION(ディレクトリ)を解析し、/.../の間の単語のみを呼び出したいとします。

case "$TR_TORRENT_INFO" in
    *test1.com*)
    A_DESTINATION=${A_DESTINATION}/Books/
    ;;
    *test2.com*)
    A_DESTINATION=${A_DESTINATION}/Movies/
    ;;
    *test3.com*)
    A_DESTINATION=${A_DESTINATION}/Music/
    ;;
    *)
    A_DESTINATION=${A_DESTINATION}/Miscellaneous/
    ;;
esac

test="$(egrep '\/([^/.]+)\/$' $A_DESTINATION)"
echo test

スクリプトに正規表現がありますが、ログにフォルダー(たとえば、この場合/ Miscellaneous /)は正常に返されません。次の内容のみが表示されます。

+ A_DESTINATION=/mnt/sda1/Miscellaneous/
+ egrep \/([^/.]+)\/$ /mnt/sda1/Miscellaneous/
+ test=
+ echo test
test

私は何が間違っていましたか?ありがとうございます!

答え1

最後のディレクトリサフィックスを追加して$A_DESTINATIONからgrep別の方法で再抽出するのではなく、ステートメントに別の変数(たとえば$final)を使用してから最後にcase追加するのはどうですか?$A_DESTINATIONたとえば、

case "$TR_TORRENT_INFO" in
    *test1.com*) final='Books' ;;
    *test2.com*) final='Movies' ;;
    *test3.com*) final='Music' ;;
              *) final='Miscellaneous' ;;
esac

A_DESTINATION="$A_DESTINATION/$final/"

echo "$final"

これは効果があり、より簡単で、私の考えでは読書にも簡単です。

しかし、本や映画などを囲む一重引用符は必ずしも必要ではありませんが(文字列にスペースやシェルメタ文字がないため)問題にならず、IMO一重引用符で文字列を修正するのが良い習慣です。また、最後のディレクトリ名にスペースを含む他の大文字と小文字を追加するには、final='Other Junk' ;;単一引用符を使用する必要があります(たとえば、次のような名前にすることができます)。

答え2

次のようなスチールドライブの推奨事項/ジョブから末尾を省略します。

case "$TR_TORRENT_INFO" in
    *test1.com*) A_DESTINATION="$A_DESTINATION/Books"  ;;
    *test2.com*) A_DESTINATION="$A_DESTINATION/Movies" ;;
    *test3.com*) A_DESTINATION="$A_DESTINATION/Music"  ;;
    *) A_DESTINATION="$A_DESTINATION/Miscellaneous"
esac

...または変数を使用して追加されたパス要素を保持します。Kassが提案したように、読みやすくなります。

これにより、basenameユーティリティまたはパラメータ置換を使用して${parameter##word}取得できます$A_DESTINATION

パス名のデフォルト名はファイルである必要はありません。これはパスの最後の部分です。

printf 'basename is "%s"\n' "${A_DESTINATION##*/}"

または

printf 'basename is "%s"\n' "$( basename "$A_DESTINATION" )"

後でパスにファイル名を追加すると、それからパス区切り記号が含まれています/

filepath="$A_DESTINATION/$filename"

あなたのegrep命令:

egrep '\/([^/.]+)\/$' $A_DESTINATION

egrepこれはファイルを読み取り、$A_DESTINATION与えられた正規表現を適用するように指示します。

以下はうまくいきますが(末尾がないと仮定して/)、上記の解決策を使用する必要があります。

printf '%s\n' "$A_DESTINATION" | grep -o '[^/]*$'

test標準コマンドの名前でもあるため、変数名として使用しないでください。コマンドを「オーバーロード」する危険はありませんが、testコードを読みにくくすることができます。

関連情報