如何从 bash 中的字符串开头删除点和斜线?

如何从 bash 中的字符串开头删除点和斜线?

我想./从 的开头删除./Accounts.

这是我的脚本:

export Item=./Accounts
echo $Item
export ReplacedItem=${$Item/.\//}
echo $ReplacedItem

但我得到:

main.sh:第 3 行:ReplacedItem=${$Item/.//}:错误替换

我究竟做错了什么?

答案1

使用标准运算符1,这里sh ${param#pattern}不需要${param/pattern/replacement}(不是)ksh93 式的运算符。${$param/pattern/replacement}

此外,除非您希望其他命令继承这些变量,否则导出这些变量是没有意义的。另请记住echo不能用于打印任意数据,并且参数扩展必须在bash.

Item=./Accounts
printf '%s\n' "$Item"
ReplacedItem="${Item#./}"
printf '%s\n' "$Item"

如果使用 ksh93-style ${param/pattern/replacement},则应该是:

ReplacedItem="${Item/.\//}"

/如果替换是空字符串,则可以省略模式和替换之前的内容:

ReplacedItem="${Item/.\/}"

但请注意,它会删除第一次出现的./in $Item,即使它不是在开头。要仅在其位于开头时将其删除,您可以#在模式的开头添加。

ReplacedItem="${Item/#.\/}"

(但同样,与标准相比没有优势${Item#./})。


最初来自 ksh,已经存在于 ksh85 中,并由 POSIXsh在 90 年代初指定,因此受到所有标准实现(sh包括.bashsh

² 至少是列表上下文中的那些。在var=$param(赋值给 a 时,引号并不是绝对必要的标量变量,而不是列表/大批变量)和其他一些非列表上下文,但不会造成伤害。

相关内容