5
#!/bin/bash
outbound=/home/user/outbound/
putfile=DATA_FILE_PUT_*.CSV
cd $outbound
filecnt=0
for file in $putfile; do let filecnt=filecnt+1; done
echo "Filecount: " $filecnt

因此,当出站目录中有文件时,此代码运行良好。我可以将文件放入出站路径,只要它们与 putfile 掩码匹配,文件就会按预期递增。

问题出在哪里,如果我在没有文件位于$outbound. 如果有零个文件,$filecnt仍然会返回 a但如果那里没有文件, 1我希望它返回 a 。0

我错过了一些简单的东西吗?

4

4 回答 4

5

放在set -x该行下方#!以查看您的脚本在做什么。

如果没有匹配的文件,则通配符不展开,循环运行一次,file值为DATA_FILE_PUT_*.CSV.

要更改它,请设置 nullglob 选项。请注意,这只适用于 bash,不适用于 sh。

shopt -s nullglob
putfile=DATA_FILE_PUT_*.CSV
for file in $putfile; do let filecnt=filecnt+1; done

请注意,该putfile变量包含通配符模式,而不是文件名列表。将匹配列表放在变量中可能更有意义。这需要是一个数组变量,并且您需要先更改当前目录。匹配文件的数量就是数组的长度。

#!/bin/bash
shopt -s nullglob
outbound=/home/user/outbound/
cd "$outbound"
putfiles=(DATA_FILE_PUT_*.CSV)
echo "Filecount: " ${#putfiles}

如果您需要遍历文件,请注意使用双引号保护数组的扩展,否则如果文件名包含空格,则它将被拆分为多个单词(如果文件名包含通配符,它​​们将被扩展)。

#!/bin/bash
shopt -s nullglob
outbound=/home/user/outbound/
cd "$outbound"
putfiles=(DATA_FILE_PUT_*.CSV)
for file in "${putfiles[@]}"; do
  echo "Processing $file"
done
于 2013-10-07T19:54:20.407 回答
2

您可以先测试文件是否存在

for file in $putfile; do
  if [ -f "$file" ] ; then
    let filecnt=filecnt+1
  fi
done

或使用 find 查找您的文件

for file in $(find . -type f -name="$putfile"); do
  let filecnt=filecnt+1
done

或简单地说(固定)

filecnt=$(find . -type f -name "$putfile" | wc -l); echo $filecnt
于 2013-10-07T19:50:39.387 回答
1

不知道为什么在这里需要一段代码。跟随一个班轮应该做你的工作。

ls ${outbound}/${putfile} | wc -l

或者

find ${outbound} -maxdepth 1 -type f -name "${putfile}" | wc -l
于 2013-10-07T19:46:25.327 回答
1

这是因为当没有找到匹配项时,bash 默认将通配符扩展DATA_FILE_PUT_*.CSV为单词DATA_FILE_PUT_*.CSV,因此最终计数为 1。要禁用此行为,请使用shopt -s nullglob

于 2013-10-07T19:50:44.263 回答