如何将“$ @”的值作为单个参数传递?

时间:2016-04-18 11:09:08

标签: bash shell sh

我写了以下Go代码。

package main

import (
  "fmt"
  "os"
  "strings"
)

func main() {
  fmt.Println(os.Args)
}

然后编译它......

$ go build -o out

并创建了以下脚本a.sh

#! /bin/bash

set -eu

./out "--opt1" "$@"

然后运行a.sh,结果是:

$ a.sh hoge --foo bar
[./out --opt1 hoge --foo bar ]

我想将$@作为字符串。我期待[./out --opt1 "hoge --foo bar" ]作为结果。

但是它们被拆分为数组元素(按空格或$IFS?)。 有没有想法获得$@

2 个答案:

答案 0 :(得分:3)

您可能希望改为使用"$*"

以下是一个例子:

函数f1使用"$@"打印其参数,而f2使用"$*"执行相同操作。

f1() { printf '<%s>\n' "$@"; }
f2() { printf '<%s>\n' "$*"; }

注意输出的差异:

$ f1 a b c
$ <a>
$ <b>
$ <c>
$ f2 a b c
$ <a b c>

$@$*之间的差异:

  • 没有双引号(不要这样做!):  没有区别。

  • 双引号:  "$@"将每个位置参数扩展为自己的参数:"$1" "$2" "$3" ...,而"$*"扩展为单个参数"$1c$2c..." ,其中'c'是IFS的第一个字符。

答案 1 :(得分:1)

Go Code

package main

import (
    "fmt"
    "os"
)   

func main() {
    for i, arg := range os.Args {
        fmt.Printf("Args[%d] = %s\n", i, arg)
    }
}

Bash代码

#! /bin/bash

set -eu

./out "--opt1" "$*"

输出

$ ./a.sh hoge --foo bar
Args[0] = ./out
Args[1] = --opt1
Args[2] = hoge --foo bar

说明

3.2.5. Special parameters州的{p> Bash Guide for Beginners

  
      
  • $* - 从1开始扩展到位置参数。当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由IFS特殊变量的第一个字符分隔。
  •   
  • $@ - 从1开始扩展到位置参数。当扩展发生在双引号内时,每个参数都会扩展为单独的单词。
  •   
     

“$ ”的实现一直是个问题,现实应该已经被“$ @”的行为所取代。在几乎所有编码人员都使用“$ ”的情况下,他们的意思是“$ @”。 “$ *”可能会导致软件中的错误甚至安全漏洞。