rm-f元';不能处理bash脚本中的所有参数
在bash中遇到了一个奇怪的问题。我想编写一个脚本,该脚本采用文件名的前缀,并删除所有以该前缀开头并以某些给定后缀结尾的文件。为此,我有以下代码行:rm-f元';不能处理bash脚本中的所有参数,bash,expansion,rm,Bash,Expansion,Rm,在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.g
#!/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
不幸的是,当我调用我的脚本(称为cleanletaxe
)时,正如预期的那样:
cmd$ cleanlatex lpa_aaai.
仅删除.aux文件。显然rm-f
并没有将其应用程序扩展到所有参数,如果我显式运行rm-f lpa\u aaai.aux lpa\u 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
第二组由
无法删除消息组成,与我无关:我只将这些删除作为故障保护。这正是我所需要的。谢谢。你的问题到底是什么还不清楚;但是,您可以将脚本缩减为两行bash
:
: ${1?Please provide an argument}
rm -f "$1".{aux,bbl,log,synctex.gz,log}
使用标准POSIX参数展开,第一行与if
语句具有相同的效果
第二行正确地引用了$1
,并使用大括号扩展生成具有所需后缀列表的文件名序列。它简化了一个假设,即用户键入文件的基本名称时没有尾随句点:当foo
足够时,谁会键入foo.
?您已经假设没有名为(例如)foo.aux
和foo..aux
的文件,因此您最好假设工作量较小
我删除了exit 0
,因为rm
成功,您的脚本将以0状态退出,或者rm
失败,在这种情况下,您不应该以0状态退出,但无论以何种状态退出rm
。不清楚您的实际问题是什么;但是,您可以将脚本缩减为两行bash
:
: ${1?Please provide an argument}
rm -f "$1".{aux,bbl,log,synctex.gz,log}
使用标准POSIX参数展开,第一行与if
语句具有相同的效果
第二行正确地引用了$1
,并使用大括号扩展生成具有所需后缀列表的文件名序列。它简化了一个假设,即用户键入文件的基本名称时没有尾随句点:当foo
足够时,谁会键入foo.
?您已经假设没有名为(例如)foo.aux
和foo..aux
的文件,因此您最好假设工作量较小
我删除了exit 0
,因为rm
成功,您的脚本将以0状态退出,或者rm
失败,在这种情况下,您不应该以0状态退出,但是无论以什么状态退出rm
都可以。尝试以下操作:rm-f$1{,}{aux,bbl,blg,log,synctex.gz}
。我的机器上没有问题,在输入中使用或不使用
均可正常工作。如果您是从当前目录运行脚本,请在.sh
文件之前使用/
,或者使用绝对路径作为/tmp/foo/myscript.sh
。如果您将设置-x
添加到脚本顶部,并将-v
添加到rm
调用,您会看到什么?请查看我的编辑。尝试以下操作:rm-f$1{,}{aux,bbl,blg,log,synctex.gz}
。在我的机器上没有问题,在输入中使用或不使用
均可正常工作。如果您是从当前目录运行脚本,请在.sh
文件之前使用/
,或者使用绝对路径
作为/tmp/foo/myscript.sh
。如果将设置-x
添加到脚本顶部,并将-v
添加到rm
调用中,您会看到什么?请查看我的编辑。很棒的提取工作。:)不要忘记处理OP的rm
,这也很有效,比@Etan的解决方案更优雅。我希望我能接受两个答案,但我不能。因此,为了简单起见,我将接受这一点。谢谢。@ghoti为了清晰起见,我故意省略了第二个rm
。另外,如果不清楚:我允许用户调用带有尾随“.”和不带尾随“.”的脚本的唯一原因是,在我使用的大多数shell版本中,制表符完成都会一直到“.”,这正是它应该做的。为了让脚本正常工作,我没有让用户点击退格键,因为我不想编写代码来过滤bash中的最后一个字符(根据我的经验,这非常混乱),我选择只进行两个不同的rm
调用。删除5个文件没什么大不了的。提取得很好。:)不要忘记处理OP的rm
,这也很有效,比@Etan的解决方案更优雅。我希望我能接受两个答案,但我不能。因此,为了简单起见,我将接受这一点。谢谢。@ghoti为了清晰起见,我故意省略了第二个rm
。另外,如果不清楚:我允许用户调用带有尾随“.”和不带尾随“.”的脚本的唯一原因是,在我使用的大多数shell版本中,制表符完成都会一直到“.”,这正是它应该做的。为了让脚本正常工作,我没有让用户点击退格键,因为我不想编写代码来过滤bash中的最后一个字符(根据我的经验,这非常混乱),我选择只进行两个不同的rm
调用。删除5个文件没什么大不了的。