Bash 和 sh 脚本以不同的方式读取 Here 字符串

Fed*_*vic 2 shell bash shell-script

我的代码中有这一行:

    output=$(sed 's/\/$//g' <<< $output)
Run Code Online (Sandbox Code Playgroud)

它适用于#!/bin/bash但不适用于#!/bin/sh. 在sh程序退出时Syntax error: redirection unexpected,在剖析错误行之后,我得出的结论<<<是有问题的部分。此外,在 vim 中,vim 将下面的代码变灰<<<,就好像它在某个字符串中一样。我只是想知道为什么会发生这种情况。提前致谢

Sté*_*las 5

<<<的,zsh 操作符现在也被其他一些 shell(包括bash)支持,但它仍然没有被添加到sh语言的标准规范中,并且一些sh实现仍然不支持它。

要从/变量的内容中删除尾随,它只是:

output=${output%/}
Run Code Online (Sandbox Code Playgroud)

相反,如果您想像该代码那样/从每一行的末尾删除,您可以这样做:$outputzsh

output=$(printf '%s\n' "$output" | sed 's|/$||')
Run Code Online (Sandbox Code Playgroud)

或者使用标准的 here-doc 而不是 zsh 的 here-string:

output=$(
  sed 's|/$||' << EOF
$output
EOF
)
Run Code Online (Sandbox Code Playgroud)

支持的外壳<<<有:

  • zsh, 自 1991 年以来
  • Byron Rakitzis 的rcfor Unix克隆(虽然没有添加额外的换行符),自 1991 年以来,以及衍生品 ( es, akanga)
  • ksh93, 自 2002 年以来
  • bash, 自 2002 年以来
  • mksh, 自 2008 年以来
  • yash, 自 2009 年起(不称为sh

sh不支持它作为2020年5的实现方式包括Bourne shell的ksh88ash和它的衍生物(dash,所述sh的busybox的,FreeBSD中,NetBSD的), pdkshposh,OpenBSD的shbosh