Phi*_*ide 2 bash pipe shell-script
我正在编写一个 bash 脚本。我有一系列管道来获取 git 存储库上的所有分支:
git ls-remote $1 'refs/heads/*' \
| rev \
| cut -d'/' -f1 \
| rev \
| if [ -z $2 ]
then
echo {}
else
echo {} > $2
fi
Run Code Online (Sandbox Code Playgroud)
目前,if 语句部分无法正常工作。我用什么来代替{}它来完成这项工作?
要将标准输入复制到标准输出,请使用cat,而不是echo。
git ls-remote "$1" 'refs/heads/*' |
sed 's~.*/~~' |
if [ -z "$2" ]
then
cat
else
cat > "$2"
fi
Run Code Online (Sandbox Code Playgroud)
还要注意引号的正确使用和管道的放置,这样您就可以避免使用反斜杠。的使用sed是一个非常小的优化,但我也发现它比reva 周围的 double 更清晰cut(前提是您了解正则表达式)。您也可以使用awk -F/ '{ print $NF }'(但那需要您熟悉 Awk)。
你可以cat通过这样做来避免;
${2+exec >"$2"}
git ls-remote "$1" | sed 's~.*/~~'
Run Code Online (Sandbox Code Playgroud)
(如果您将空字符串作为第二个参数传递,则失败至少应该比 with 更明确,如果不一定更有帮助[ -z,它无法区分未设置和空值。)
您可以替换{}您尝试使用的语法,cat因为您正在尝试从中读取stdin:
git ls-remote $1 'refs/heads/*' \
| rev \
| cut -d'/' -f1 \
| rev \
| if [ -z $2 ]
then
cat
else
cat > $2
fi
Run Code Online (Sandbox Code Playgroud)
更新:不需要子shell,谢谢@tripleee。