首页 > 解决方案 > 来自自定义函数的 echo 调用的 bash shell 问题

问题描述

我正在学习 bash 语言的过程中(v.painful),我正在与下面的代码作斗争。对其当前行为的任何解释将不胜感激。

代码

#!/usr/bin/env bash

function useless
{
    echo "$1"
    return 0
}

function call-and-report
{
    TEST_CRITERIA="$1"
    
    if $TEST_CRITERIA
    then
        echo "passed"
    else
        echo "failed"
    fi
}

call-and-report $(useless  "Hello World")

问题

我期待以下控制台输出:

Hello World
passed

相反,我看到以下输出:

./../test.sh: line 13: Hello: command not found
failed

标签: bash

解决方案


$(command)执行command然后将其标准输出替换为命令行。因此,无论useless终端上没有打印什么打印,它都会被替换回调用命令行。

所以你的最后一个命令变成:

call-and-report Hello World

然后在里面call-and-report,$1Hello, 你把它分配给TEST_CRITERIA. 当你这样做

if $TEST_CRITERIA

相当于

if Hello

这试图Hello作为命令执行。由于没有这样的命令,你会得到一个错误。

如果你想测试是否有任何东西$TEST_CRITERIA,你需要使用test命令,也可以作为[.

if [ -n "$TEST_CRITERIA" ]

请注意,由于您没有引用$(useless "Hello World")它输出的每个单词,因此它成为call-and-report.

如果你想在$TEST_CRITERIA终端上打印的值,你需要在call-and-report.

function useless
{
    echo "$1"
    return 0
}

function call-and-report
{
    TEST_CRITERIA="$1"
    echo "$TEST_CRITERIA"

    if [ -n "$TEST_CRITERIA" ]
    then
        echo "passed"
    else
        echo "failed"
    fi
}

call-and-report "$(useless  "Hello World")"

推荐阅读