让我们调用以下replace.sh
if "$1" !=""
then
REPLACE_AS=$1
else
REPLACE_AS="Tebow"
fi
find . ! -regex ".*[/]\.svn[/]?.*" -type f -print0 | xargs -0 -n 1 sed -i -e 's/SANCHEZ/'$REPLACE_AS'/g'
抱歉原始问题。我试图使其成为命令行参数是可选的。 IE如果有人没有把它,只是运行这个脚本,它使用Tebow。这似乎有效。但是,如果我使用命令行参数运行脚本它不起作用。
即
./ test.sh
这将用tebow取代它。
然而 ./test.sh史密斯
不会用Smith替换Sanchez字符串
答案 0 :(得分:6)
您可以使用shell parameter expansion和符号:
REPLACE_AS="${1:-Tebow}"
在一行中做你在6中做的事。
此外,您编写的代码应为:
if [ "$1" != "" ]
then REPLACE_AS="$1"
else REPLACE_AS="Tebow"
fi
测试命令为[
;它的操作数需要空格,最后需要]
。如果它包含空格,则需要"$1"
周围的引号; "Tebow"
周围的引号是可选的,因为它不包含空格(但均匀性很好)。
没有什么能阻止你写作:
xargs -0 -n 1 sed -i -e 's/SANCHEZ/'"${1:-Tebow}"'/g'
但变量的清晰度很好,特别是如果你多次引用它。
另外,为了清楚起见,我会将管道留在行尾并在第二行开始第二个命令(xargs
)(再次 - 这非常重要)。
find . ! -regex ".*[/]\.svn[/]?.*" -type f -print0 |
xargs -0 -n 1 sed -i -e 's/SANCHEZ/'"$REPLACE_AS"'/g'
有时,但不经常,我会缩进第二个命令。
请注意"$REPLACE_AS"
周围的双引号;它可以防止替换文本中出现空格问题。