为什么函数中的 $1 不打印脚本的第一个参数?

pie*_*tti 15 bash shell-script function

为什么不在这个简单的 bash 脚本中echo $1打印$1

#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something

$ ./function.sh 123  -> why doesn't it print '123' as a result?
Run Code Online (Sandbox Code Playgroud)

wei*_*dan 43

位置参数指的是脚本主层中的脚本参数,但指的是函数体中的函数参数。所以

print_something Something
Run Code Online (Sandbox Code Playgroud)

实际上会打印Something.

如果要将脚本的参数传递给函数,则必须显式执行此操作。用

print_something "$1"
Run Code Online (Sandbox Code Playgroud)

传递第一个参数,或

print_something "$@"
Run Code Online (Sandbox Code Playgroud)

传递所有这些,尽管示例中的函数只使用第一个。

  • @allo 不。`"$*"` 将是一个单独的字符串(连接在 `$IFS` 的第一个字符上),而 `"$@"` 将是一个单独引用的元素列表。 (14认同)
  • 但我想,重点是展示如何*通过*所有参数。就目前而言,该函数仅使用其第一个参数这一事实有点无关紧要。 (13认同)
  • @Kusalananda 告诉想要将命令行参数传递给函数的人使用 `"$@"` 的要点,即使在这种情况下_只有一个这样的参数,也是为了涵盖_所有_这种情况。如果 OP 决定添加第二个参数,则函数调用中没有任何更改。阅读本文的每个人都将学习正确的方法,以避免以后也必须重新做。 (5认同)

Rud*_*diC 10

这是因为被调用的函数获得自己的一组位置参数,独立于父/调用者的设置。尝试

print_something "$1"
Run Code Online (Sandbox Code Playgroud)

(并且echo "$1",甚至更好printf '%s\n' "$1",记住引用参数扩展并且echo不能用于任意数据)。

  • 使用 `echo $1` 没有意义,除非您希望将 `$1` 视为要扩展的以 $IFS 分隔的文件模式列表。`echo "$1"` 会更有意义,但不会像 `-nene`、`-EE` 那样为 `$1` 的值输出 `$1` 的内容...... (6认同)