2

我正在编写一个 bash 脚本,它必须将一个变量传递给另一个程序:

./program $variable

问题是,绝对有必要将 $variable 作为单个参数传递,如果它包含空格则不是这种情况。

variable=Hello World
./program $variable
-> program receives two arguments: 'Hello' 'World'

引用它根本没有做任何事情(做得好,bash 开发人员):

variable=Hello World
./program "$variable"
-> program receives: 'Hello' 'World'

双引号会做一些疯狂的事情(干得好,bash 开发人员):

variable=Hello World
./program "'$variable'"
-> program receives: "'Hello" "World'"

是否有捷径可寻?哎呀,有没有办法做到这一点?

更新:好的,因为问题似乎不是 bash,这里有一些附加信息。我传递参数的程序是一个 python 脚本。在不以任何方式修改参数的情况下,我得到

print sys.argv
-> ['/usr/bin/program', "'Hello", "World'"]

我该如何解决?

编辑:不,我没试过

variable="Hello World"

因为我从不声明 $variable。它没有在我的 bash 函数中声明,也不允许我修改它。

编辑:好的,我让它这样工作。

local temp="$variable"
./program "$temp"

不过,我想知道为什么它以这种方式工作,而不是以其他方式工作。

4

5 回答 5

1

你试过var="hello world"吗?

我在我的solaris盒子里试过这个。

> setenv var "hello world"
> cat temp.sh
#!/bin/sh

echo $1
echo $2
> ./temp.sh "$var"
hello world

>

如您所见,$2未打印。$var被认为只是一个论点。

于 2012-10-22T08:40:24.993 回答
1

当您调用脚本时,请在引号内传递参数。

示例脚本:

#!/bin/bash
for arg in "$@"; do
 echo "arg: $1";
 shift;
done

当你调用它时:

./program "parameter with multiple words" parameter2 parameter3 "another parameter"

输出应该是:

arg: parameter with multiple words
arg: parameter2
arg: parameter3
arg: another parameter
于 2012-10-22T08:40:30.003 回答
1

看看http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html

问题是变量的扩展是在命令行参数之前完成的,因此您的行为。

您可以通过将 IFS 设置为一些奇怪的东西来解决它

IFS='###' V='foo bar baz'; ./program $V 
于 2012-10-22T08:58:51.267 回答
0

这几乎肯定是您在程序中读取变量的方式存在的问题。
例如,假设这是您的脚本(仅用于测试的一行):

echo "$1"

我们称它为 echo.sh。如果你跑echo.sh "test best",你会得到test best

但是如果你的程序说

echo $1

你可能会得到像你所看到的那样的行为。

于 2012-10-22T08:32:39.413 回答
0

问题似乎在“程序”内部

variable="Hello World"    # quotes are needed because of the space
./program "$variable"     # here quotes again

并在程序内部

echo "program received $# arguments:" 
i=1
for arg in "$@"      # again quotes needed
do echo "arg $((i=i+1)): '$arg'"    # and again
done
于 2012-10-22T08:40:21.940 回答