Bashスクリプトとshスクリプトは、Here文字列を別々に読み込みます。

Bashスクリプトとshスクリプトは、Here文字列を別々に読み込みます。

私のコードには次の行があります。

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

操作はされますが、#!/bin/bash動作しません#!/bin/shshプログラム終了時にエラーラインを分析した結果、これが問題となる部分Syntax error: redirection unexpectedという結論に達しました。<<<また、vimでは、vimは下のコードが<<<文字列内にあるかのように灰色で表示します。なぜこれが起こるのか知りたいです。事前にありがとう

ベストアンサー1

はい<<<、zsh演算子は他のいくつかのシェル(ZSHを含む)でサポートされていますが、まだ言語の標準仕様に追加されておらず、一部のbash実装ではまだサポートされていません。shsh

変数の内容から末尾を削除するには/:

output=${output%/}

代わりに、このコードのように¹/の各行の末尾から削除するには、次のようにします。$outputzsh

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

あるいは、zshのhere-stringの代わりに標準のhere-docを使用してください。

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

サポートされるシェルは<<<次のとおりです。

  • zsh、1991年から
  • 1991年の時点で、Byron RakitzisのrcUnixクローン(追加の改行文字を追加しなかったにもかかわらず)および派生製品(es、、akanga
  • ksh93、2002年から
  • bash、2002年から
  • mksh、2008年から
  • yash、2009年以降(呼び出し時ではないsh

sh2020年5月現在、これをサポートしていない実装には、Bourneシェルksh88とそのash派生物(busybox、FreeBSD、NetBSD dash)、OpenBSDが含まれます。shpdkshposhshbosh


1およびすべての末尾の改行(追加された改行printfおよびある場合の改行$output)は、コマンド置換の副作用として結果に含まれます。たとえば、(完全に有効なファイルパス)の場合$output$'///\n/\n/'//

おすすめ記事