Answers:
FILEPATH_WITH_GLOB="/home/user/file_*"
现在,FILEPATH_WITH_GLOB
包含/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
包含file_*
。
echo $FILENAME #file_1234
$FILENAME
在列表上下文中不加引号时,该扩展将进行split + glob运算符,因此将其扩展到匹配文件的列表:在参数扩展时执行文件名生成。
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
在列表上下文中它仍然是未引用的参数扩展,因此仍然经历split + glob。但是,此ile_*
模式与任何文件都不匹配,因此它会扩展为自身。
您可能想要的是:
shopt -s nullglob # have globs expand to nothing when they don't match
set -- /home/user/file_* # expand that pattern into the list of matching
# files in $1, $2...
for file do # loop over them
filename=$(basename -- "$file")
printf '%s\n' "$filename" "${filename:1:5}"
done
或者您可以将它们存储在数组中:
shopt -s nullglob
files=(/home/user/file_*)
如果您只关心第一个匹配项,或者知道只有一个匹配项,则可以将该文件称为$files
。bash
具有通常烦人的行为,而不是$files
扩展到${files[0]}
数组的所有元素(此行为继承自ksh
,固定为zsh
),但是在这里,这只是一次想要的行为。
bash
状阵列:files=(/home/user/file_*)
。
echo
不应用于任意数据,并且在列表上下文中不应该将变量不加引号)。
FILEPATH_WITH_GLOB=`echo /home/user/file_*`
解释完后设法解决。