【发布时间】:2021-11-14 11:54:32
【问题描述】:
考虑以下代码,其中我定义了两个函数,func1 和 func2:
func1 () {
local FLAGS=${1}
echo "func1 $FLAGS"
}
func2 () {
local FLAGS=${1}
echo "func2 $FLAGS"
func1 $FLAGS
}
FLAGS="-p -i"
func1 $FLAGS
func2 $FLAGS
func1 "-p -i"
func2 "-p -i"
目的是向他们传递一个参数,在本例中为FLAGS="-p -i"。我希望上面的所有四个调用都是等价的。但是,这是我得到的输出:
func1 -p
func2 -p
func1 -p
func1 -p -i
func2 -p -i
func1 -p
这告诉我,无论何时将参数保存到变量中,都会对其进行解析,并且仅将前空白部分传递给函数。我的问题是为什么会发生这种情况以及如何将整个 $FLAG 参数传递给函数,无论它是否包含空格?
【问题讨论】:
-
你应该几乎总是在变量(和参数)引用周围加上双引号,以避免像这样奇怪的解析问题。请参阅 "When should I double-quote a parameter expansion?" Shellcheck.net 擅长发现此类常见错误。顺便说一句,我还建议使用小写或混合大小写的变量名称,因为有很多具有特殊含义的全大写名称,并且错误地重复使用其中之一也会导致问题。
-
@Botond:使用
func1 "-p -i",您将(由于引号)single 参数-p -i传递给您的函数。使用func1 $FLAGS,shell 首先扩展变量FLAGS,并对扩展进行分词,得到func1 -p -s。这样你就传递了两个参数,-p和-s。
标签: bash