在sh中操纵参数

its*_*dok 4 bash shell scripting sh

我正在使用一个实用程序(unison,但这不是重点)接受如下参数:

$ unison -path path1 -path path2 -path path3
Run Code Online (Sandbox Code Playgroud)

我想写一个我可以这样运行的sh脚本:

$ myscript path1 path2 path3
Run Code Online (Sandbox Code Playgroud)

我希望有一个符合Posix标准的解决方案,但特定于bash也会很好.

我猜它应该是这样的:

#!/bin/sh
unison ${*/ / -path }
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

编辑:好的,我想我得到了一些东西:

#!/bin/bash
PARAMS=
for arg in "$@"
do
    PARAMS+=" -path '$arg'"
done
unison $PARAMS
Run Code Online (Sandbox Code Playgroud)

问题是这只适用于bash,我很确定有更好的方法来引用参数.

Jon*_*ler 5

未经检查,可能很简单:

exec unison -path $1 -path $2 -path $3
Run Code Online (Sandbox Code Playgroud)

如果您没有在路径名中嵌入空格,那么您可以处理可变数量的参数:

arglist=""
for path in "$@"
do
    arglist="$arglist -path $path"
done
exec unison $arglist
Run Code Online (Sandbox Code Playgroud)

如果你的路径名中有空格,那么你必须努力工作; 我通常使用一个名为的自定义程序escape,它引用需要引用的参数,并且eval:

arglist=""
for path in "$@"
do
    path=$(escape "$path")
    arglist="$arglist -path $path"
done
eval exec unison "$arglist"
Run Code Online (Sandbox Code Playgroud)

我注意到使用Perl或Python会使处理带有空格的参数更容易 - 但问题是关于shell.

在Bash中使用shell数组变量也是可行的 - 将参数构建到数组中并将数组作为参数传递给unison命令.