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

Bash:将变量作为单个参数/shell引号参数传递,bash,python-2.7,quotes,Bash,Python 2.7,Quotes,我正在编写一个bash脚本,它必须将一个变量传递给另一个程序: ./program $variable 问题是,$variable绝对有必要作为单个参数传递,如果它包含空格,则情况并非如此 variable=Hello World ./program $variable -> program receives two arguments: 'Hello' 'World' 引用它根本没有任何作用(做得好,bash开发人员): 双重引用它做了疯狂的事情(做得好,bash开发人员): 有没有

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

./program $variable
问题是,$variable绝对有必要作为单个参数传递,如果它包含空格,则情况并非如此

variable=Hello World
./program $variable
-> program receives two arguments: 'Hello' 'World'
引用它根本没有任何作用(做得好,bash开发人员):

双重引用它做了疯狂的事情(做得好,bash开发人员):

有没有一个简单的方法可以做到这一点?见鬼,有办法做到这一点吗

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

print sys.argv
-> ['/usr/bin/program', "'Hello", "World'"]
我怎样才能解决这个问题

编辑:不,我没有试过

variable="Hello World"
因为我从不声明$variable。它不是在我的bash函数中声明的,我不允许修改它

编辑:好的,我就是这样做的

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

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

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

我们叫它echo.sh。如果运行
echo.sh“test best”
,您将获得
test best

但是如果你的程序说

echo $1

你可能会表现得像你看到的那样

问题似乎在“程序”内部

在程序内部

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

您是否尝试过使用
var=“hello world”

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

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

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

>

如您所见,
$2
未打印。
$var
仅被视为一个参数

调用脚本时,在引号内传递参数

示例脚本:

#!/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
看一看

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

你可以把IFS设置为一些奇怪的东西,比如

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

问题出在"程序"上,
/program“$variable”
传递一个可以包含空格的参数,程序正在做什么?你是否尝试过
variable=“Hello World”
@sarathi:没有,因为我实际上从未声明过$variable。我只是把它传下去。
variable
来自哪里?如何声明
variable
以及在哪里?错误可能就在那里。谢谢你的链接和解释。看那本指南,看来我永远也不会喜欢bash了。太好了!如果变量包含空格和双引号,您可以做什么?
./program "parameter with multiple words" parameter2 parameter3 "another parameter"
arg: parameter with multiple words
arg: parameter2
arg: parameter3
arg: another parameter
IFS='###' V='foo bar baz'; ./program $V