我正在尝试解析变量 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
...或使用变量来保存添加的路径元素正如卡斯建议的那样,这样会更容易阅读。
这将允许您使用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
,但可能会使代码难以阅读。