“${1/%\//}”扩展为什么?

Viv*_*and 6 bash shell-script

if [[ "$1" != "" ]]; then
    dr="${1/%\//}"
fi
Run Code Online (Sandbox Code Playgroud)

在上面的代码中, "${1/%\//}"扩展为什么?

Kus*_*nda 17

这是一种迂回的方法,可以在 、 或 shell 中删除以a结尾/的值末尾的a 。$1/bashkshzsh

它使用非标准参数替换,替换匹配项${parameter/%pattern/replacement}末尾的文本。这里使用的模式是,即文字斜杠(必须对其进行转义,否则它将充当分隔符),并且替换为空。通过测试,仅当值非空时才执行替换和赋值。$parameterpattern\/ifdr$1

编写相同内容的更便携的方式是

[ -n "$1" ] && dr=${1%/}
Run Code Online (Sandbox Code Playgroud)

或者,

if [ -n "$1" ]; then
    dr=${1%/}
fi
Run Code Online (Sandbox Code Playgroud)

标准替换${parameter%pattern}会删除(最短的子字符串)pattern从 中的值末尾匹配的内容$parameter。在上面的代码中,我将其与模式一起使用/,以删除字符串中的最后一个字符(如果它是斜杠)。

该测试也更改为不太复杂的-n测试,如果给定字符串非空,则测试为真。