[英]Shell parameter expansion working in ksh but not in bash
為什么下面的代碼在ksh和bash中產生不同的output
p="folderA/folderB/folderC"
echo ${p%%+([^/])}
echo ${p#${p%%+([^/])}}
ksh 輸出:
folderA/folderB/
folderC
bash 輸出:
folderA/folderB/folderC
我特別困惑,因為我使用了bash 文檔來創建這個參數擴展。
我想在最后一個斜杠之后提取文件夾名稱。 我發現了另一種在 ksh 和 bash 中工作的方法:
echo ${p##*/}
但我想了解為什么第一種方法不起作用。
+(...)
是擴展 glob 語法,您需要為 bash 啟用extglob
功能才能理解它。 如另一個答案所述,通常不應使用抑揚符來否定字符 class。 Bash 可以容忍這個錯誤,但無論如何,為了可移植性,讓我們使用正確的語法:
shopt -s extglob
p="folderA/folderB/folderC"
echo "${p%%+([!/])}"
echo "${p#${p%%+([!/])}}"
產量:
folderA/folderB/
folderC
相關鏈接: Bash 參考手冊§模式匹配。
順便說一句,您實際上並不需要擴展 glob。
p="folderA/folderB/folderC"
echo "${p%${p##*/}}"
echo "${p##*/}"
上面的腳本同樣適用於任何符合 POSIX 的 shell。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.