我的代码中有这一行:
output=$(sed 's/\/$//g' <<< $output)
它适用于#!/bin/bash
但不适用于#!/bin/sh
.在sh
程序退出时Syntax error: redirection unexpected
,在剖析错误行后,我得出的结论<<<
是有问题的部分。另外,在 vim 中,vim 将下面的代码变灰<<<
,就好像它在某个字符串中一样。我只是想知道为什么会发生这种情况。提前致谢
答案1
是的<<<
,zsh 运算符现在也受到其他一些 shell(包括bash
)的支持,但它仍然没有被添加到该sh
语言的标准规范中,并且一些sh
实现仍然不支持它。
要从变量内容中删除尾随,/
只需:
output=${output%/}
相反,如果您想像该代码一样从¹/
中的每一行末尾删除,您可以这样做:$output
zsh
output=$(printf '%s\n' "$output" | sed 's|/$||')
或者使用标准的here-doc而不是zsh的here-string:
output=$(
sed 's|/$||' << EOF
$output
EOF
)
支持的 shell<<<
有:
zsh
,自 1991 年起- Byron Rakitzis 的
rc
Unix 克隆(尽管没有添加额外的换行符),自 1991 年起也是如此,以及衍生品 (es
,akanga
) ksh93
,自2002年起bash
,自2002年起mksh
,自2008年起yash
,自 2009 年起(不是称为 时sh
)
sh
截至 2020 年 5 月,不支持它的实现包括 Bourne shell、ksh88
及其ash
衍生物(busybox、FreeBSD、NetBSD 的dash
)、、、OpenBSD 、。sh
pdksh
posh
sh
bosh
1 以及结果中所有尾随换行符(添加的换行符printf
和来自的换行符$output
(如果有的话))作为命令替换的副作用。例如,如果$output
是$'///\n/\n/'
(顺便说一下,一个完全有效的文件路径),它将变成//
.