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

Joh*_*ear 82 bash

我有以下bash两个脚本

灰:

#!/bin/bash
./b.sh 'My Argument'
Run Code Online (Sandbox Code Playgroud)

b.sh:

#!/bin/bash
someApp $*
Run Code Online (Sandbox Code Playgroud)

someApp二进制文件接收$*2个参数('My'和'Argument')而不是1.

我测试了几件事:

  • 只运行someApp通过b.sh按预期工作
  • b.sh按预期迭代+回显工作中的参数
  • 使用$@而不是$*没有区别

che*_*ner 133

$*,未引用,扩展为两个字.你需要引用它以便someApp接收一个参数.

someApp "$*"
Run Code Online (Sandbox Code Playgroud)

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

b.sh 'My first' 'My second'
Run Code Online (Sandbox Code Playgroud)

有了someApp "$*",someApp会收到一个论点My first My second.有了someApp "$@",someApp会收到两个参数,My firstMy second.

  • 容易错过的关键是"$ @"需要引用,似乎.$ @还不够. (20认同)
  • @miracle2k 正确。不加引号,`$@` 和 `$*` 的工作方式相同。 (2认同)
  • @Matt完全不同。“ $ @”的特殊之处在于它分别引用每个参数。因此,它可能导致不止一个论点。“ $ something”只是将$ something扩展为的引号,并且始终是单个参数。 (2认同)
  • 仅当我设置 `IFS=$'\n'` 时,答案才对我有效。不知道为什么。 (2认同)