我正在写一个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"
我想知道它为什么会这样,而不是其他任何方式。
答案 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