2

让我们调用以下 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 的这个脚本。这似乎行得通。但是,如果我使用命令行参数运行脚本,它就不起作用。

IE

./test.sh

这将用 tebow 替换它。

然而 ./test.sh 史密斯

不会用 Smith 替换 Sanchez 字符串

4

1 回答 1

7

您可以使用shell 参数扩展和表示法:

REPLACE_AS="${1:-Tebow}"

在一行中完成您在 6 中所做的事情。

此外,您编写的代码应该是:

if [ "$1" != "" ]
then REPLACE_AS="$1"
else REPLACE_AS="Tebow"
fi

测试命令是[;它的操作数周围需要空格,最后需要 a ]。如果它包含空格,则需要引号"$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"。它可以防止替换文本中的空格问题。

于 2013-05-13T19:23:14.857 回答