在变量扩展后添加文本 - Fish

use*_*492 1 shell fish

我想在变量扩展后添加文本,但鱼认为我指的是不同的变量名,例如

$ set dessert "cake"
$ echo $dessert
cake
$ echo "I want 7 $desserts"
I want 7 
$ cat ./menu.txt | sed "s/$desserts/cookie/g"
sed: first RE may not be empty
Run Code Online (Sandbox Code Playgroud)

jgr*_*eve 7

看起来你想在你的变量周围加上大括号,比如“{$dessert}s”。例子:

> set xyz blarch
> echo $xyz
blarch
> echo ${xyz}
Variables cannot be bracketed. In fish, please use {$xyz}.
fish: echo ${xyz}
            ^
> echo {$xyz}
blarch
> echo i like {$xyz}s
i like blarchs
> 
Run Code Online (Sandbox Code Playgroud)

编辑 2:嗯...红利鱼扩展重新@glenn jackman 的例子:安排这种方式可以更容易地看到输出差异:

        示例鱼命令::结果
-------------------------------------------------: :------------------------
> 设置 foo 栏;echo 莎士比亚是一个 {$foo} :: 莎士比亚是一个酒吧
> 设置 foo 栏;echo 莎士比亚是个 {$foo}d :: 莎士比亚是个吟游诗人
> 设置 foo 栏;echo "shakespere was a {$foo}d" :: Shakespere was a {bar}d
> 设置 foo 栏;echo "shakespere was a {"$foo"}d" :: Shakespere was a {bar}d
> 设置 foo 栏;echo "shakespere was a "{$foo}"d" :: Shakespere was a bard
> 设置 foo 栏;echo "shakespere was a "$foo"d" :: 莎士比亚是吟游诗人
> 

好像最后一个效率最高。

编辑:我想指出 Fish 与其他 shell(如 bash)在 w/var 扩展方面有点不同。请注意行为, {$xyz} 不会失败,但它的工作方式与 Fish 不同......相反,{} 在那里被视为文字,它产生“{moreblarch}”,如下所示:

bash 示例:

$ export xyz=moreblarch
$ echo $xyz
moreblarch
$ echo {$xyz}
{moreblarch}
$ echo ${xyz}
moreblarch
$ echo who doesnt like ${xyz}s?
who doesnt like moreblarchs?
$ 
Run Code Online (Sandbox Code Playgroud)

编辑 3:根据@glennjackman 的数组注释进行排列 这不是我所期望的 :-) “echo -e”会将 \n 解释为换行符,从而更容易查看输出。请注意,排列之间插入了一个空格(这就是为什么 #2 - #27 有一个前导空格)。

> set a A B C; set b 1 2 3; set c x y z; echo -e ":a="$a" b="$b" c="$c":\n"
:a=A b=1 c=x:
 :a=B b=1 c=x:
 :a=C b=1 c=x:
 :a=A b=2 c=x:
 :a=B b=2 c=x:
 :a=C b=2 c=x:
 :a=A b=3 c=x:
 :a=B b=3 c=x:
 :a=C b=3 c=x:
 :a=A b=1 c=y:
 :a=B b=1 c=y:
 :a=C b=1 c=y:
 :a=A b=2 c=y:
 :a=B b=2 c=y:
 :a=C b=2 c=y:
 :a=A b=3 c=y:
 :a=B b=3 c=y:
 :a=C b=3 c=y:
 :a=A b=1 c=z:
 :a=B b=1 c=z:
 :a=C b=1 c=z:
 :a=A b=2 c=z:
 :a=B b=2 c=z:
 :a=C b=2 c=z:
 :a=A b=3 c=z:
 :a=B b=3 c=z:
 :a=C b=3 c=z:

> 
Run Code Online (Sandbox Code Playgroud)