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

3

我正在编写一个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"

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


1
问题出现在"程序"中;./program "$variable"传递一个参数,该参数可能包含空格,程序在做什么? - Nahuel Fouilleul
2
你试过使用 variable="Hello World" 吗? - Vijay
@sarathi:不,因为我实际上从未声明$variable变量。我只是将其传递。 - Aran-Fey
其实我也不知道。bash函数是处理tab补全的其中之一(在/etc/bash_completion.d/myprogram中)。如果你真的需要知道,它是$COMP_WORDS。 - Aran-Fey
你在任务中不需要引号(正如你在最新更新中展示的那样)。例如,这样写是完全可以的:temp=$variable;不需要这样写:temp="$variable"。然而,当将变量作为参数传递给./program时,你确实需要使用引号,否则变量的值会被展开;例如,请使用:./program "$temp",而不是 ./program $temp。即使不使用变量,你也可以复现这个情况;比如:好的写法是:./program "one two";错误的写法是:./program one two - michael
显示剩余2条评论
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 被视为一个参数。


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

1

谢谢链接和解释。看了那个指南,感觉我永远都不会喜欢 bash。 - Aran-Fey

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

太棒了!如果变量包含空格和双引号,你可以做什么? - yesennes

0
这几乎可以肯定是你在程序中读取变量的方式有问题。
例如,假设这是你的脚本(只是用于测试的一行代码):
echo "$1"

我们将其称为echo.sh。如果你运行echo.sh "test best",你将得到test best。
但是如果你的程序说
echo $1

你可能会得到类似于你所看到的行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接