変数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
コードを読みにくくすることができます。