rm -f 不会处理 bash 脚本中的所有参数
rm -f won't handle all arguments in bash script
在 bash 中遇到了一些特殊问题。我想编写一个脚本,该脚本采用文件名前缀并删除所有以该前缀开头并以某些给定后缀结尾的文件。为此,我有以下代码行:
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Please provide an argument";
exit 1
fi
# Ending dot already included in
rm -f "aux" "bbl" "blg" "synctex.gz" "log"
# But even if you call it wrong...
rm -f ".aux" ".bbl" ".blg" ".synctex.gz" ".log"
exit 0
不幸的是,当我按预期调用我的脚本(称为 cleanlatex
)时:
cmd$ cleanlatex lpa_aaai.
只删除了.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
第二组由 cannot remove
条消息组成,与我无关:无论如何,我只是将这些删除作为故障保险。这正是我所需要的。谢谢。
不清楚你的问题究竟是什么;但是,您可以将脚本缩减为两行 bash
:
: ${1?Please provide an argument}
rm -f "".{aux,bbl,log,synctex.gz,log}
第一行与您的 if
语句具有相同的效果,使用标准 POSIX 参数扩展。
第二行正确引用 </code> 并使用大括号扩展生成具有所需后缀列表的文件名序列。它做了一个简单的假设,即用户输入的文件的基本名称没有尾随句点:当 <code>foo
就足够时,谁会输入 foo.
?您已经假设没有名为(例如)foo.aux
和 foo..aux
的文件,因此您不妨做出一个减少工作量的假设。
我删除了 exit 0
因为要么 rm
成功并且你的脚本无论如何都会以状态 0 退出,要么 rm
失败,在这种情况下你不应该以 0 状态退出, 但无论状态 rm
退出与.
在 bash 中遇到了一些特殊问题。我想编写一个脚本,该脚本采用文件名前缀并删除所有以该前缀开头并以某些给定后缀结尾的文件。为此,我有以下代码行:
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Please provide an argument";
exit 1
fi
# Ending dot already included in
rm -f "aux" "bbl" "blg" "synctex.gz" "log"
# But even if you call it wrong...
rm -f ".aux" ".bbl" ".blg" ".synctex.gz" ".log"
exit 0
不幸的是,当我按预期调用我的脚本(称为 cleanlatex
)时:
cmd$ cleanlatex lpa_aaai.
只删除了.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
第二组由 cannot remove
条消息组成,与我无关:无论如何,我只是将这些删除作为故障保险。这正是我所需要的。谢谢。
不清楚你的问题究竟是什么;但是,您可以将脚本缩减为两行 bash
:
: ${1?Please provide an argument}
rm -f "".{aux,bbl,log,synctex.gz,log}
第一行与您的 if
语句具有相同的效果,使用标准 POSIX 参数扩展。
第二行正确引用 </code> 并使用大括号扩展生成具有所需后缀列表的文件名序列。它做了一个简单的假设,即用户输入的文件的基本名称没有尾随句点:当 <code>foo
就足够时,谁会输入 foo.
?您已经假设没有名为(例如)foo.aux
和 foo..aux
的文件,因此您不妨做出一个减少工作量的假设。
我删除了 exit 0
因为要么 rm
成功并且你的脚本无论如何都会以状态 0 退出,要么 rm
失败,在这种情况下你不应该以 0 状态退出, 但无论状态 rm
退出与.