可选的命令行参数Shell

时间:2013-05-13 19:21:07

标签: linux bash shell

让我们调用以下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字符串

1 个答案:

答案 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"周围的双引号;它可以防止替换文本中出现空格问题。