FILEPATH_WITH_GLOB="/home/user/file_*"
Sekarang, FILEPATH_WITH_GLOB
berisi/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
berisi file_*
.
echo $FILENAME #file_1234
$FILENAME
tidak dikutip dalam konteks daftar, bahwa ekspansi mengalami split + glob operator, jadi itu diperluas ke daftar file yang cocok: pembuatan nama file dilakukan pada ekspansi parameter .
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
Ini masih merupakan perluasan parameter yang tidak dikutip dalam konteks daftar, jadi masih mengalami split + glob. Namun di sini, ile_*
polanya tidak cocok dengan file apa pun, jadi pola itu berkembang sendiri.
Apa yang mungkin Anda inginkan di sini adalah:
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
Atau Anda dapat menyimpannya dalam sebuah array:
shopt -s nullglob
files=(/home/user/file_*)
Jika Anda hanya peduli pada pertandingan pertama, atau Anda tahu hanya ada satu pertandingan, Anda dapat merujuk ke file tersebut sebagai $files
. bash
memiliki perilaku yang biasanya menjengkelkan yang $files
meluas ke ${files[0]}
semua elemen array (perilaku yang diwarisi dari ksh
, diperbaiki zsh
), tetapi di sini, itu akan menjadi perilaku yang diinginkan untuk sekali.
FILEPATH_WITH_GLOB=`echo /home/user/file_*`
setelah penjelasan Anda.bash
array seperti:files=(/home/user/file_*)
.echo
tidak boleh digunakan untuk data arbitrer , variabel tidak boleh ditinggalkan tanda kutip dalam konteks daftar).