FILEPATH_WITH_GLOB="/home/user/file_*"
Şimdi FILEPATH_WITH_GLOB
içeriyor/home/user/file_*
FILENAME=$(basename "$FILEPATH_WITH_GLOB")
FILENAME
içerir file_*
.
echo $FILENAME #file_1234
$FILENAME
liste bağlamında alıntı yapılmadığında, bu genişletme split + glob işlecinden geçer, bu da eşleşen dosya listesine genişletilir: parametre genişletmesi üzerine dosya adı üretimi gerçekleştirilir .
echo ${FILENAME:1:5} #ile_* <---why is this not ile_1
Hala liste bağlamında alıntılanmamış bir parametre genişletmesi, bu yüzden hala split + glob geçiriyor. Bununla birlikte, burada ile_*
desen herhangi bir dosyayla eşleşmez, bunun yerine kendi kendine genişler.
Muhtemelen burada istediğiniz şey:
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
Veya bunları bir dizide saklayabilirsiniz:
shopt -s nullglob
files=(/home/user/file_*)
Yalnızca ilk eşleşmeyi önemsiyorsanız veya yalnızca bir eşleşme olduğunu biliyorsanız, bu dosyaya şu adresten başvurabilirsiniz $files
. bash
genellikle can sıkıcı davranışa sahip olduğu $files
için genişlediğinde ${files[0]}
yerine tüm (miras bir davranış dizinin elemanlarının ksh
sabit, zsh
bir kez olsun istedik davranış olur), ama burada.
FILEPATH_WITH_GLOB=`echo /home/user/file_*`
Açıklamanızdan sonra geçici bir çözüm yapmayı başardınız.