Bash:将变量作为单个参数/ shell引用参数传递

时间:2012-10-22 08:26:04

标签: bash python-2.7 quotes

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

./program $variable

问题是,$ variable必须作为单个参数传递,如果它包含空格则不是这样。

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

引用它根本不做任何事情(做得好,bash devs):

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

双引用它做了疯狂的事情(干得好,bash devs):

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"

我想知道它为什么会这样,而不是其他任何方式。

5 个答案:

答案 0 :(得分: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被视为仅一个参数。

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

你可能会将IFS设置为奇怪的东西(

IFS='###' V='foo bar baz'; ./program $V 

答案 3 :(得分:0)

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

echo "$1"

我们称之为echo.sh.如果您运行echo.sh "test best",则会获得test best

但如果你的程序说

echo $1

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

答案 4 :(得分: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