脚本中的通配符问题

时间:2014-01-21 15:07:10

标签: bash

我对通配符有这个“问题”,我只是想弄清楚为什么会这样。

以下示例:

#!/bin/bash
basefolder=/tmp/
rm $basefolder"processed/*.txt*"

这导致rm的错误消息“无法找到/ tmp / processed / .txt ”。 这当然不正确,因为此文件夹中有文件,当我只是从错误消息中复制并通过该文件夹时,它会正确删除它。

同样适用于for循环

#!/bin/bash
basefolder=/tmp/
for file in $basefolder"processed/*.txt*"
...

无效,我的解决方法如下

#!/bin/bash
basefolder=/tmp/
filepattern=$basefolder"processed/*.txt*"
for file in $filepattern
...

另一种方法是将basefolder设置为/ tmp,然后使用$ basefolder / processed / .txt (这会起作用),但我更好奇为什么这个问题甚至存在。

任何人都可以给我一个解释吗?

2 个答案:

答案 0 :(得分:0)

问题在于引用

ls /tmp/"foo*"

表示列出名为/tmp/foo* 的文件匹配/tmp/foobar/tmp/foo

ls /tmp/foo*(没有引号)与/tmp/foo/tmp/foobar匹配

所以,这些都应该有效:

basefolder=/tmp/
rm ${basefolder}processed/*.txt*

# I like this better, no need for ${}:
basefolder=/tmp
rm $basefolder/processed/*.txt*

# the loop:
basefolder=/tmp
for file in $basefolder/processed/*.txt*

答案 1 :(得分:0)

不保护模式*.txt*它有效。 因此脚本应该是:

#!/bin/bash
basefolder=/tmp
/bin/rm "$basefolder"/processed/*.txt*