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"
假设我有这个变量
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"