rm-f元';不能处理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

在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
不幸的是,当我调用我的脚本(称为
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个文件没什么大不了的。