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

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

我的代码中有这一行:

    output=$(sed 's/\/$//g' <<< $output)

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

答案1

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

要从变量内容中删除尾随,/只需:

output=${output%/}

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

output=$(printf '%s\n' "$output" | sed 's|/$||')

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

output=$(
  sed 's|/$||' << EOF
$output
EOF
)

支持的 shell<<<有:

  • zsh,自 1991 年起
  • Byron Rakitzis 的rcUnix 克隆(尽管没有添加额外的换行符),自 1991 年起也是如此,以及衍生品 ( es, akanga)
  • ksh93,自2002年起
  • bash,自2002年起
  • mksh,自2008年起
  • yash,自 2009 年起(不是称为 时sh

sh截至 2020 年 5 月,不支持它的实现包括 Bourne shell、ksh88及其ash衍生物(busybox、FreeBSD、NetBSD 的dash)、、、OpenBSD 、。shpdkshposhshbosh


1 以及结果中所有尾随换行符(添加的换行符printf和来自的换行符$output(如果有的话))作为命令替换的副作用。例如,如果$output$'///\n/\n/'(顺便说一下,一个完全有效的文件路径),它将变成//.

相关内容