#!/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
仍会返回1
,但如果没有文件,我希望它返回0
。
我错过了一些简单的东西吗?
答案 0 :(得分:3)
将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
答案 1 :(得分:1)
您可以先测试文件是否存在
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
答案 2 :(得分:1)
这是因为当找不到匹配项时,默认情况下bash会将通配符DATA_FILE_PUT_*.CSV
扩展为单词DATA_FILE_PUT_*.CSV
,因此最终计数为1。
要禁用此行为,请使用shopt -s nullglob
答案 3 :(得分:0)
不确定为什么你需要一段代码。一个班轮应该完成你的工作。
ls ${outbound}/${putfile} | wc -l
或
find ${outbound} -maxdepth 1 -type f -name "${putfile}" | wc -l