FILEPATH_WITH_GLOB="/home/user/file_*"
Bây giờ, FILEPATH_WITH_GLOB
chứa/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
chứa file_*
.
echo $FILENAME #file_1234
$FILENAME
không được trích dẫn trong ngữ cảnh danh sách, việc mở rộng đó trải qua toán tử split + global, do đó, nó được mở rộng thành danh sách tệp phù hợp: việc tạo tên tệp được thực hiện khi mở rộng tham số .
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
Nó vẫn là một mở rộng tham số không được trích dẫn trong ngữ cảnh danh sách, vì vậy vẫn trải qua quá trình phân tách + toàn cầu. Tuy nhiên, ở đây, ile_*
mẫu không khớp với bất kỳ tệp nào, vì vậy nó sẽ mở rộng sang chính nó.
Những gì bạn có thể muốn ở đây là:
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
Hoặc bạn có thể lưu trữ chúng trong một mảng:
shopt -s nullglob
files=(/home/user/file_*)
Nếu bạn chỉ quan tâm đến trận đấu đầu tiên hoặc bạn biết chỉ có một trận đấu, thì bạn có thể tham khảo tệp đó là $files
. bash
có hành vi gây phiền nhiễu thường $files
mở rộng ra ${files[0]}
thay vì tất cả các yếu tố của mảng (một hành vi được kế thừa từ ksh
, cố định zsh
), nhưng ở đây, đó sẽ là hành vi mong muốn một lần.
FILEPATH_WITH_GLOB=`echo /home/user/file_*`
sau lời giải thích của bạn.