私は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
また、バックスラッシュを避けるために引用符を正しく使用してパイプを配置する必要があります。使用は非常にマイナーな最適化ですが、sed
doubleを囲むよりもきれいだと思います(grok正規表現がある場合)。使用することもできます(ただし、これにはAwkを知る必要があります)。rev
cut
awk -F/ '{ print $NF }'
cat
これによりこれを防ぐことができます。
${2+exec >"$2"}
git ls-remote "$1" | sed 's~.*/~~'
[ -z
(空の文字列を2番目の引数として渡す場合、失敗は設定されていない値とnull値を区別できないため、これ以上有用ではない場合でも、少なくともwithよりも明示的でなければなりません。)
答え2
読みたいので、{}
使用したい構文を置き換えることができます。cat
stdin
git ls-remote $1 'refs/heads/*' \
| rev \
| cut -d'/' -f1 \
| rev \
| if [ -z $2 ]
then
cat
else
cat > $2
fi
修正する:サブシェルは必要ありません。ありがとうございます。@サムルタ。