web-dev-qa-db-ja.com

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

私はbashスクリプトを書いています。私はgitリポジトリのすべてのブランチを取得するために動作する一連のパイプを持っています:

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

現在、これのifステートメント部分は正しく機能しません。何を置き換えますか{}でこれを機能させるには?

2

標準入力を標準出力にコピーするには、catではなくechoを使用します。

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

バックスラッシュを回避できるように、引用符の適切な使用とパイプの配置にも注意してください。 sedの使用は非常にマイナーな最適化ですが、revの周りの二重のcutよりも明確であることがわかります(groex regexの場合)。 awk -F/ '{ print $NF }'を使用することもできます(ただし、Awkを調べる必要があります)。

代わりにこれを行うことでcatを回避できます。

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

(2番目の引数として空の文字列を渡す場合の失敗は、[ -zを使用した場合よりも明示的である必要がありますが、未設定と空の値を区別できません。)

7
tripleee

{}catから読み取ろうとしているため、stdinで使用しようとしている構文:

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

更新:サブシェルは必要ありません、ありがとう @ tripleee

5
eush77