【问题标题】:bash: calling a scripts with double-quote argumentbash:使用双引号参数调用脚本
【发布时间】:2010-12-31 23:35:41
【问题描述】:

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

$ export_map "0 0 100 100"

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

select ENCODING in UTF8 WIN1252 WIN1255 ISO-8859-8;
...
select NAV_SELECT in Included Excluded;

自然,这两个语句都需要输入一个数字作为输入。这可以通过将数字和换行符传递到脚本来绕过。

为了节省时间,我想要一个脚本来创建 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

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

基本上,我正在寻找将双引号内的参数接受到包装器 bash 脚本的方法,然后将其与双引号一起传递给内部脚本。

澄清:

export_map是主脚本,被create_map调用了8次。

有什么想法吗?

谢谢,

亚当

【问题讨论】:

  • 我有点不清楚你想在这里做什么。您说您正在尝试使用 select 语句做某事,但您的 bash 脚本中没有 select 语句。您在不同的行上打印出两个数字,并将其传递到您未提供代码的export_map.sh 脚本的调用中(它与您之前提到的create_map 相同吗?)。我也不清楚您的报价问题出现在哪里。您能否尝试详细说明您到底想要做什么,以及您遇到的确切问题?
  • 我已经澄清了我的答案 - 非常感谢。

标签: bash quotes


【解决方案1】:

如果我正确理解了您的问题(我不确定;请参阅我的评论),您可能应该在您的 printf 中添加另一个 \nprintf 默认情况下不会像 echo 那样添加尾随换行符。这将确保select 命令可以正确读取第二个值,我假设该命令出现在export_map.sh 中。

printf "$nav\n$enc\n" | /bin/bash -c "./export_map.sh \"100 200 300 400\""

另外,我认为您不需要添加 /bin/bash -c 和引号。除非我遗漏了什么,否则以下内容就足够了:

printf "$nav\n$enc\n" | ./export_map.sh "100 200 300 400"

编辑感谢您的澄清。为了将包装脚本中的参数传递到内部脚本中,将其保留为单个参数,您可以传入"$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

下面是"$@" 工作原理的简单示例。一、inner.bash

#!/bin/bash

for str in "$@"
do
    echo $str
done

outer.bash:

#!/bin/bash

./inner.bash "$@"

并调用它:

$ ./outer.bash "foo bar" baz "quux zot"
foo bar
baz
quux zot

【讨论】:

  • +1 很好的答案。也非常喜欢您的 Twitter 图像编码挑战。
  • 谢谢!我在这个挑战上花费了很多时间和精力……但这很有趣。
猜你喜欢
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2020-06-25
  • 2019-02-08
  • 2020-04-06
  • 1970-01-01
  • 2021-04-03
  • 2017-11-30
相关资源
最近更新 更多