首页 > 解决方案 > 为什么有和没有 * 在 Bash 中有所不同

问题描述

[更新]

我正在尝试找出参数替换,尤其是关于${var#Pattern}and ${var##Pattern}

根据文档

${var#Pattern} 从 $var 中删除 $Pattern 中与 $var 前端匹配的最短部分。

${var##Pattern} 从 $var 中删除 $Pattern 中与 $var 前端匹配的最长部分。

现在,当我运行以下命令时,我预计第三个和第四个将是相同的,但事实并非如此。

我预计第四个输出是o Hello World!.

为什么?

*与第一个和第二个示例相比,这种情况下的效果如何?

#!/usr/bin/env bash

myString="Hello Hello World!"
ll="ll"
Hel="Hel"

echo "${myString#*$Hel}"     # lo Hello World!
echo "${myString#$Hel}"      # lo Hello World!
echo
echo "${myString#*$ll}" # o Hello World!
echo "${myString#$ll}"  # Hello Hello World!

输出:

lo Hello World!
lo Hello World!

o Hello World!
Hello Hello World!

标签: bash

解决方案


${myString#$ll}, 等价于,在 的开头${myString#ll}删除,但不在 开头,因此没有效果。llmyStringmyStringll

另一方面,${myString#*$ll}允许通配符*匹配He并且$ll将(显然)匹配ll


推荐阅读