可选的命令行参数Shell

Fra*_*gio 2 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'
Run Code Online (Sandbox Code Playgroud)

抱歉原始问题.我试图使其成为命令行参数是可选的.IE如果有人没有把它,只是运行这个脚本,它使用Tebow.这似乎有效.但是,如果我使用命令行参数运行脚本它不起作用.

./test.sh

这将取代tebow.

然而./test.sh史密斯

不会用史密斯取代桑切斯的字符串

Jon*_*ler 7

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

REPLACE_AS="${1:-Tebow}"
Run Code Online (Sandbox Code Playgroud)

在一行中做你在6中做的事.

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

if [ "$1" != "" ]
then REPLACE_AS="$1"
else REPLACE_AS="Tebow"
fi
Run Code Online (Sandbox Code Playgroud)

测试命令是[; 它需要围绕其操作数的空间和]最后的空间."$1"如果它包含空格,你需要引号; 引号"Tebow"是可选的,因为它不包含空格(但均匀性很好).

没有什么可以阻止你写作:

xargs -0 -n 1 sed -i -e 's/SANCHEZ/'"${1:-Tebow}"'/g'
Run Code Online (Sandbox Code Playgroud)

但变量的清晰度很好,特别是如果你多次引用它.

另外,xargs为了清楚起见,我会将管道留在行尾并在第二行开始第二个命令()(再次 - 这非常重要).

find . ! -regex ".*[/]\.svn[/]?.*" -type f -print0 |
xargs -0 -n 1 sed -i -e 's/SANCHEZ/'"$REPLACE_AS"'/g'
Run Code Online (Sandbox Code Playgroud)

有时,但不经常,我会缩进第二个命令.注意双引号"$REPLACE_AS"; 它可以防止替换文本中的空格问题.