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


13

为什么不能在这个简单的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?

6
因为您在调用print_something时忘记了$ 1。请尝试在问题中而不是标题中包含文本。
Rui F Ribeiro

谢谢。如果我需要在脚本中插入以下命令,则echo参数应该是什么:print_something“ $ 1”; print_something“ $ 2”; 也许更多?
pietro letti

13
当我在HNQ看到此消息时,我以为您正在打印钞票,并希望阅读一些有关打印机如何检测到您正在打印假币的多汁故事。
管道

@pipe我以前曾发生过这种情况,由于某种原因,它拒绝打印任何内容,而不仅仅是具有反打印预防措施的内容。
Codingale

Answers:


41

位置参数在脚本的主要级别中引用脚本的参数,但在函数主体中引用函数的参数。所以

print_something Something

实际上会打印Something

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

print_something "$1"

通过第一个参数,或者

print_something "$@"

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


1
传递"$@"print_something,正如目前所写的那样,尽管如此,它仍只会输出第一个参数。
库沙兰丹

13
我想,关键是要说明如何传递所有参数。就其功能而言,该函数仅使用其第一个参数的事实有点无关紧要。
weirdan

好吧,仅考虑仅使用第一个参数就没有必要传递所有参数。
库沙兰丹

14
@allo号"$*"将是一个字符串(连接到的第一个字符$IFS),而"$@"将是一个单独引用的元素的列表。
库萨兰达

5
@Kusalananda告诉一个想要将命令行参数传递给函数的人的要点是"$@",即使在这种情况下只有一个这样的参数,也要涵盖所有这样的情况。如果OP决定添加第二个参数,则函数调用中没有任何更改。而且其他所有阅读此内容的人都将学习正确的方法来做到这一点,从而避免以后再做。
蒙蒂·哈德

10

这是因为被调用函数获得了自己的位置参数集,而与父级/调用者的集无关。尝试

print_something "$1"

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


您需要弄清楚您在说什么。调用方$1通常与函数不同$1,尽管如上述建议使用时它们可以变得相同。如果我说对了,当使用单个参数调用该函数时(使用调用者的$ 1并将其“ 放入”函数中),函数echo可以保持不变()echo $1print_something $2$1
RudiC

6
echo $1除非您希望$1将其视为$ IFS分隔的文件模式列表以进行扩展,否则使用没有任何意义。echo "$1"会更有意义,虽然中不会输出内容$1的值$1一样-nene-EE...
斯特凡Chazelas
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.