在bash中匹配变量的正确语法是什么?

时间:2016-01-18 17:58:09

标签: bash shell

在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

我不确定第一个脚本的语法有什么问题。

由大家解决和解释,谢谢你教我。

2 个答案:

答案 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参数传递给函数。