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
), но здесь, это будет желаемое поведение на этот раз.
FILEPATH_WITH_GLOB=`echo /home/user/file_*`
после вашего объяснения.bash
массив , как:files=(/home/user/file_*)
.echo
не должны использоваться для произвольных данных , переменные не должны оставаться без кавычек в контексте списка).