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_*)
最初の一致のみに関心がある場合、または一致が1つしかないことがわかっている場合は、そのファイルをとして参照できます$files
。bash
通常、配列のすべての要素の代わりに$files
展開される厄介な動作${files[0]}
(から継承された動作ksh
、で修正zsh
)を持っていますが、ここでは、これは一度は望ましい動作です。
FILEPATH_WITH_GLOB=`echo /home/user/file_*`
あなたの説明の後に回避策を講じることができました。