使用parameter expansions刪除.pdf
部分,像這樣:
shopt -s nullglob
files=(*.pdf)
echo "${files[@]%.pdf}"
的shopt -s nullglob
使用水珠時,始終是一個好主意:它將使水珠擴大到什麼,如果沒有匹配。
"${files[@]%.pdf}"
將展開爲一個陣列,並刪除所有尾部.pdf
。你可以,如果你願意把這個在另一個數組像這樣:
files_noext=("${files[@]%.pdf}")
這一切是100%安全的關於文件名(空格,換行等)有趣的符號,除了echo
一部分文件命名爲-n.pdf
,-e.pdf
和-E.pdf
...但echo
只是出於演示目的。你的files=($(ls *.pdf))
真的很糟! 千萬不要分析ls
的輸出。
回答您的評論:substring擴展不能在數組的每個字段上工作。從上面鏈接的參考手冊採取:
${parameter:offset}
${parameter:offset:length}
如果offset
計算結果爲數字小於零,則該值被用作從parameter
值的末端偏移。如果length
的計算結果爲小於零的數字,並且parameter
不是@
而不是索引或關聯數組,則它被解釋爲從parameter
的值的末尾開始的偏移量,而不是一定數量的字符,擴展是字符在兩個偏移量之間。如果parameter
是@
,則結果是length
位置參數以偏移量開始。 如果parameter
是下標爲@
或*
的索引陣列名稱,則結果爲以${parameter[offset]}
開頭的length
陣列成員。相對於大於指定數組的最大索引值的偏移量,採用負偏移量。應用於關聯數組的子字符串擴展會產生未定義的結果。
因此,例如,,
$ array=(zero one two three four five six seven eight)
$ echo "${array[@]:3:2}"
three four
$
謝謝!完美的作品:) –
這是否意味着子串擴展不適用於數組? (我也嘗試'回聲「$ {files [@]:0:-3}」'它不起作用) –
@HåkonHægland編輯回答你的問題。 –