我想./
从 的开头删除./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
包括.bash
sh
² 至少是列表上下文中的那些。在var=$param
(赋值给 a 时,引号并不是绝对必要的标量变量,而不是列表/大批变量)和其他一些非列表上下文,但不会造成伤害。