我写了以下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
?)。
有没有想法获得$@
?
答案 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)
package main
import (
"fmt"
"os"
)
func main() {
for i, arg := range os.Args {
fmt.Printf("Args[%d] = %s\n", i, arg)
}
}
#! /bin/bash
set -eu
./out "--opt1" "$*"
$ ./a.sh hoge --foo bar
Args[0] = ./out
Args[1] = --opt1
Args[2] = hoge --foo bar
$*
- 从1开始扩展到位置参数。当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由IFS特殊变量的第一个字符分隔。$@
- 从1开始扩展到位置参数。当扩展发生在双引号内时,每个参数都会扩展为单独的单词。“$ ”的实现一直是个问题,现实应该已经被“$ @”的行为所取代。在几乎所有编码人员都使用“$ ”的情况下,他们的意思是“$ @”。 “$ *”可能会导致软件中的错误甚至安全漏洞。