在(bash)脚本之间传递带有空格的参数


92

我有以下bash两个脚本

灰:

#!/bin/bash
./b.sh 'My Argument'

b.sh:

#!/bin/bash
someApp $*

someApp二进制接收的$*是2个参数(“ My”和“ Argument”),而不是1。

我已经测试了几件事:

  • b.sh按预期运行someApp
  • b.sh按预期方式迭代+回显工作中的参数
  • 使用$@代替$*没有区别

6
试试someApp "$*"someApp "$@"
Russell Uhl

1
尤普(Yupp)-像魅力一样!
John Fear 2013年

Answers:


146

$*,未加引号,扩展为两个单词。您需要引用它,以便someApp接收单个参数。

someApp "$*"

这有可能是您要使用$@代替,这样someApp如果你要打电话将获得两个参数b.sh

b.sh 'My first' 'My second'

有了someApp "$*"someApp就会收到一个论点My first My second。使用someApp "$@"someApp将收到两个参数,My firstMy second


24
似乎很容易遗漏的关键是,似乎需要将“ $ @”引号引起来。$ @是不够的。
miracle2k 2014年

1
@ miracle2k正确。未引用,$@并且$*工作相同。
chepner 2014年

2
@Matt完全不同。“ $ @”的特殊之处在于它分别引用每个参数。因此,它可能导致一个以上的争论。“ $ something”只是将$ something扩展到的引号,并且始终是单个参数。
卡罗·伍德

答案只有对我有用IFS=$'\n'。不知道为什么。
Dominic M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.