bash - 变量中带有通配符的文件名

标签 bash

#!/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/

相关文章:

bash - 使用 date 命令获取下个月?

linux - 如何在解析数据之前替换字符

xcode - 执行嵌入到一行终端命令中的 Swift 代码

linux - awk 在其他路径上运行时不起作用

linux - 使用 gnuplot 将命令放在多行中

bash - 替换 shell 脚本参数中的环境变量

linux - 如何在我的 bash 脚本中显示正在分析的文件的名称?

bash - Julia 命令行魔法使一个命令等待下一个命令

bash - Azure CLI 解析

bash - 如何在 for 循环中循环选择一小组选项?