在bash中匹配变量的正确语法是什么?
#!/bin/bash
# test1.sh
say_hello()
{
if [ "$1" = true ]; then
echo "hello"
else
echo "goodbye"
fi
}
say_hello
$ sh test1.sh true
> goodbye
如果我删除了该功能,那么它就像我期望的那样工作。
#!/bin/bash
# test2.sh
if [ "$1" = true ]; then
echo "hello"
else
echo "goodbye"
fi
$ sh test2.sh true
> hello
我不确定第一个脚本的语法有什么问题。
由大家解决和解释,谢谢你教我。
答案 0 :(得分:3)
bash中的函数有自己的位置参数列表 - 传递给函数的参数。
与其他编程语言一样,您需要将参数从主脚本传递给函数:
say_hello()
{
if [ "$1" = "true" ]; then
echo "hello"
else
echo "goodbye"
fi
}
say_hello "$1"
顺便说一下,"true"
在这个上下文中只是一个字符串,而不像其他编程语言中的布尔值。我会引用它,只是为了表达它。
另一方面,您在shebang行使用#!/bin/bash
,但是使用sh script.sh
调用脚本。虽然/bin/sh
是某些系统中/bin/bash
的链接,但并不一定如此。即使这样,bash也会认识到它已经以/bin/sh
开始,并将以兼容模式运行。如果您想使用 bash 调用脚本,请使用bash script.sh
。
答案 1 :(得分:1)
$1
是脚本的第一个输入参数,但在函数范围内,它是该函数的第一个参数。所以,这可行:
#!/bin/bash
# test1.sh
say_hello()
{
if [ "$1" = true ]; then
echo "hello"
else
echo "goodbye"
fi
}
say_hello "$1"
$ sh test1.sh true
> goodbye
请注意,这里我们将$1
参数传递给函数。