使用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或其他方式再次提取它,为什么不在语句中使用单独的变量(例如$finalcase,然后将其添加到$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

...或使用变量来保存添加的路径元素正如卡斯建议的那样,这样会更容易阅读。

这将允许您使用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,但可能会使代码难以阅读。

相关内容