在bash中有一个特殊的问题.我想创建一个脚本,该脚本采用文件名的前缀,并删除以该前缀开头并以某些给定后缀结尾的所有文件.为此,我有以下代码行:
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Please provide an argument";
exit 1
fi
# Ending dot already included in $1
rm -f $1"aux" $1"bbl" $1"blg" $1"synctex.gz" $1"log"
# But even if you call it wrong...
rm -f $1".aux" $1".bbl" $1".blg" $1".synctex.gz" $1 ".log"
exit 0
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我调用我的脚本(被称为cleanlatex)时,按预期方式:
cmd$ cleanlatex lpa_aaai.
Run Code Online (Sandbox Code Playgroud)
只删除.aux文件.显然rm -f不会将其应用程序扩展到所有参数,这是我明确运行时所做的事情rm -f lpa_aaai.aux lpa_aaai.bbl ....我在这做错了什么?
编辑:要回答@ Etan的问题,这是我在添加这些命令时看到的内容:
+ '[' 1 -lt 1 ']'
+ rm -v lpa_aaai.aux lpa_aaai.bbl lpa_aaai.blg lpa_aaai.synctex.gz lpa_aaai.log
removed ‘lpa_aaai.aux’
removed ‘lpa_aaai.bbl’
removed ‘lpa_aaai.blg’
removed ‘lpa_aaai.synctex.gz’
removed ‘lpa_aaai.log’
+ rm -v lpa_aaai..aux lpa_aaai..bbl lpa_aaai..blg lpa_aaai..synctex.gz lpa_aaai. .log
rm: cannot remove ‘lpa_aaai..aux’: No such file or directory
rm: cannot remove ‘lpa_aaai..bbl’: No such file or directory
rm: cannot remove ‘lpa_aaai..blg’: No such file or directory
rm: cannot remove ‘lpa_aaai..synctex.gz’: No such file or directory
rm: cannot remove ‘lpa_aaai.’: No such file or directory
rm: cannot remove ‘.log’: No such file or directory
Run Code Online (Sandbox Code Playgroud)
第二组由cannot remove消息组成,与我无关:无论如何,我只将这些删除作为故障保护.这完全符合我的需要.谢谢.
目前尚不清楚你的问题究竟是什么; 但是,您可以将脚本缩减为两行bash:
: ${1?Please provide an argument}
rm -f "$1".{aux,bbl,log,synctex.gz,log}
Run Code Online (Sandbox Code Playgroud)
第一行与if语句具有相同的效果,使用标准POSIX参数扩展.
第二行正确引用$1并使用大括号扩展来生成具有所需后缀列表的文件名序列.它简化了假设,用户键入了文件的基名而没有尾随句点:谁会foo.在foo什么时候输入就足够了?你已经做的假设,有没有命名(例如)文件foo.aux和foo..aux,所以你不妨做一个假设,使较少的工作.
我删除了,exit 0因为要么rm成功,你的脚本将以状态0退出,或者rm失败,在这种情况下你不应该退出0状态,但不管状态是什么rm退出.