Bash:将变量作为单个参数/shell引号参数传递
我正在编写一个bash脚本,它必须将一个变量传递给另一个程序: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开发人员): 有没有
./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