ifステートメントにパイプしますか?

ifステートメントにパイプしますか?

私はbashスクリプトを書いています。 Gitリポジトリのすべてのブランチを取得する一連のパイプラインがあります。

git ls-remote $1 'refs/heads/*' \
  | rev \
  | cut -d'/' -f1 \
  | rev \
  | if [ -z $2 ]
      then
        echo {}
      else
        echo {} > $2
    fi

現在、ifステートメント部分が正しく機能していません。{}これを行うには何を交換する必要がありますか?

答え1

標準入力を標準出力にコピーするには、代わりにcatを使用しますecho

git ls-remote "$1" 'refs/heads/*' |
sed 's~.*/~~' |
if [ -z "$2" ]
  then
    cat
  else
    cat > "$2"
fi

また、バックスラッシュを避けるために引用符を正しく使用してパイプを配置する必要があります。使用は非常にマイナーな最適化ですが、seddoubleを囲むよりもきれいだと思います(grok正規表現がある場合)。使用することもできます(ただし、これにはAwkを知る必要があります)。revcutawk -F/ '{ print $NF }'

catこれによりこれを防ぐことができます。

${2+exec >"$2"}
git ls-remote "$1" | sed 's~.*/~~'

[ -z(空の文字列を2番目の引数として渡す場合、失敗は設定されていない値とnull値を区別できないため、これ以上有用ではない場合でも、少なくともwithよりも明示的でなければなりません。)

答え2

読みたいので、{}使用したい構文を置き換えることができます。catstdin

git ls-remote $1 'refs/heads/*' \
  | rev \
  | cut -d'/' -f1 \
  | rev \
  | if [ -z $2 ]
      then
        cat
      else
        cat > $2
    fi

修正する:サブシェルは必要ありません。ありがとうございます。@サムルタ

関連情報