Bash 参数扩展 - 获取目录路径的一部分

Bash Parameter Expansion - get part of directory path

假设我有这个变量

FILE=/data/tenant/dummy/TEST/logs/2020-02-03_16.20-LSTRM.log

我正在尝试获取第 4 个子目录的名称,在此示例中为 TEST

job=${FILE%/*/*}   # This gives me /data/tenant/dummy/TEST

然后

name=${job##*/} 

这正是我想要的 - Test

然而,当我尝试像这样在 for 循环中使用它时:

for FILE in "/data/tenant/dummy/*/logs/*$year-*"; do
  job=${FILE%/*/*}
  echo $job    # /data/tenant/dummy/TEST(and few other directories, so far so good)
  name=${job##*/} 
  echo $name  
done

echo $name 的结果显示了我当前所在目录中的文件列表,而不是 TEST

主要问题是双引号将所有文件分组为一个长字符串:

for FILE in "/data/tenant/dummy/*/logs/*$year-*"

如果您执行以下操作,您可以看到此内容:

for FILE in "/data/tenant/dummy/*/logs/*$year-*"
do
    echo "+++++++++++++++++++"
    echo "${FILE}"
done

这应该打印 ++++++++++++++ 一次,然后是包含一长串文件名的单行。

要单独处理文件,请删除双引号,例如:

for FILE in /data/tenant/dummy/*/logs/*$year-*

用双引号括起单个变量引用也是一个好习惯,例如:

job="${FILE%/*/*}"
echo "$job"
name="${job##*/}"
echo "$name"