#!/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
如果那里没有文件.
我是不是漏掉了一些简单的东西?
最佳答案
将 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
关于bash - 变量中带有通配符的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19233225/