bash:使用双引号参数调用脚本

Ada*_*tan 0 bash quotes

我有一个bash脚本,一个用双引号括起来的参数,它在给定的边界内创建一个map的形状文件,例如

$ export_map "0 0 100 100"
Run Code Online (Sandbox Code Playgroud)

在脚本中,有两个select语句:

select ENCODING in UTF8 WIN1252 WIN1255 ISO-8859-8;
...
select NAV_SELECT in Included Excluded;
Run Code Online (Sandbox Code Playgroud)

当然,这两个语句要求输入输入一个数字作为输入.这可以通过将数字(后跟换行符)连接到脚本来绕过.

为了节省时间,我希望有一个脚本可以创建8个地图 - 每个组合ENCODING(4个选项)和NAV_SELECT(2个选项).

我已经将另一个bash脚本写入create_map服务器作为包装器:

#!/bin/bash

for nav in 1 2 3 4;
do
    for enc in 1 2;
    do
        printf "$nav\n$enc\n" | /bin/bash -c "./export_map.sh \"0 0 100 100\"" 
    done
done
Run Code Online (Sandbox Code Playgroud)

**这有效(谢谢,Brian!),但我找不到"0 0 100 100"从外部脚本外部传递数字参数的方法.**

基本上,我正在寻找在双引号内接受包装器bash脚本的参数的方法,并将它 - 用双引号 - 传递给内部脚本.

澄清:

export_map是主要的脚本,从create_map8次调用.

有任何想法吗?

谢谢,

亚当

Bri*_*ell 6

如果我没有理解你的问题(这我不知道,看到我的评论),很可能需要添加另一个\nprintf; printf默认情况下不会添加尾随换行符echo.这将确保通过select我假设出现的命令正确读取第二个值export_map.sh.

printf "$nav\n$enc\n" | /bin/bash -c "./export_map.sh \"100 200 300 400\""
Run Code Online (Sandbox Code Playgroud)

另外,我认为您不需要添加/bin/bash -c和引号.以下应该足够了,除非我遗漏了一些东西:

printf "$nav\n$enc\n" | ./export_map.sh "100 200 300 400"
Run Code Online (Sandbox Code Playgroud)

编辑感谢您的澄清.为了将包装器脚本中的参数传递给内部脚本,将其保存为单个参数,您可以传入"$1",其中引号表示您希望将其分组为一个参数,并且$1是您的第一个参数包装脚本.如果要将外部脚本中的所有参数传递到内部脚本,每个参数都保留为单个参数,则可以使用"$@".

#!/bin/bash

for nav in 1 2 3 4;
do
    for enc in 1 2;
    do
        printf "$nav\n$enc\n" | ./export_map.sh "$1"
    done
done
Run Code Online (Sandbox Code Playgroud)

这是一个如何"$@"工作的快速示例.首先,inner.bash:

#!/bin/bash

for str in "$@"
do
    echo $str
done
Run Code Online (Sandbox Code Playgroud)

outer.bash:

#!/bin/bash

./inner.bash "$@"
Run Code Online (Sandbox Code Playgroud)

并调用它:

$ ./outer.bash "foo bar" baz "quux zot"
foo bar
baz
quux zot
Run Code Online (Sandbox Code Playgroud)