【发布时间】:2013-10-16 19:23:19
【问题描述】:
我需要确保字符串中的最后一个字符是/
x="test.com/"
if [[ $x =~ //$/ ]] ; then
x=$x"extention"
else
x=$x"/extention"
fi
目前,false 总是触发。
【问题讨论】:
标签: regex bash shell command-line
我需要确保字符串中的最后一个字符是/
x="test.com/"
if [[ $x =~ //$/ ]] ; then
x=$x"extention"
else
x=$x"/extention"
fi
目前,false 总是触发。
【问题讨论】:
标签: regex bash shell command-line
您通常可以使用 bash 子字符串 $(string:offset:length} 执行此操作 - length 是可选的
#x是x的长度
因此
$n = 1 # 1 character
last_char = ${x:${#x} - $n}
供以后参考,
$ man bash
拥有所有的魔力
${参数:偏移量:长度}
子字符串扩展。扩展到参数的最大长度字符 从 offset 指定的字符开始。如果长度是 省略,展开为参数的子字符串,从 由偏移量指定的字符。长度和偏移量是算术的 表达式...
【讨论】:
您可以在 Bash 中使用 ${var:index} 和 ${#var} 索引字符串以获取字符串的长度。负索引表示从字符串的末尾移动到开头,以便-1 是最后一个字符的索引:
if [[ "${x:${#x}-1}" == "/" ]]; then
# last character of x is /
fi
【讨论】:
${x: -1}。您实际上并没有使用负索引,而是计算的正索引。
您的情况有点不正确。当使用=~ 时,rhs 被认为是一种模式,所以你会说pattern 而不是/pattern/。
如果你说,你会得到预期的结果
if [[ $x =~ /$ ]] ; then
而不是
if [[ $x =~ //$/ ]] ; then
【讨论】:
像这样,例如:
$ x="test.com/"
$ [[ "$x" == */ ]] && echo "yes"
yes
$ x="test.com"
$ [[ "$x" == */ ]] && echo "yes"
$
$ x="test.c/om"
$ [[ "$x" == */ ]] && echo "yes"
$
$ x="test.c/om/"
$ [[ "$x" == */ ]] && echo "yes"
yes
$ x="test.c//om/"
$ [[ "$x" == */ ]] && echo "yes"
yes
【讨论】:
/,这会得到误报吗?
* 表示“任何字符”。所以你也可以做[[ "$x" == *m/ ]] && echo "yes",在这种情况下会说是,但不是在x="test.comp/", for example. For multiple /` 也可以,请查看我更新的示例。