我如何根据bash中通过的参数确保相关命令是运行的



我正在编写我的第一个bash脚本,该脚本将使用Wraith进行一些视觉测试。我已经删除了代码,以使其更容易阅读。

我要写的是:
- bash命令接受参数-1、2或3。即regressiontest 1
-server将分配传递的参数
-alias config将分配给wraith capture configs/capture-staging-1.yamlwraith capture configs/capture-staging-2.yaml wraith capture configs/capture-staging-3.yaml
- 回声语句写入TXT文件。

脚本按预期工作。唯一的问题是:
如果运行regressiontest 1,则一切都很好,可以按预期运行wraith capture configs/capture-staging-1.yaml

我运行regressiontest 2,我希望它能运行wraith capture configs/capture-staging-2.yaml,但似乎再次运行wraith capture configs/capture-staging-1.yaml

它似乎正在使用上一个配置文件运行。如果我再次关闭和打开终端,它可以按预期工作,但是如果我连续执行不同的参数运行相同的命令,它似乎总是运行我使用的第一个命令。

我在做什么错?
我是bash脚本的新手,很难谷歌寻找答案

function regressiontest {
    regressionfolder=~/path/to/folder
    cd $regressionfolder
    alias config
    if [ $# -eq 0 ]; then
        echo "No arguments provided - USAGE: regressiontest <server>"
        return 0
    else
        server=$1
    fi
    if [ $server != 1 ] && [ $server != 2 ] && [ $server != 3 ]; then
        echo "Visual Regression Testing argument invalid - USAGE: regressiontest <server>"
    return 0
    elif [ $server == 1 ]; then
        server="1"
        alias config='wraith capture configs/capture-staging-1.yaml'
    elif [ $server == 2 ]; then
        server="2"
        alias config='wraith capture configs/capture-staging-2.yaml'
    elif [ $server == 3 ]; then
        server="3"
        alias config='wraith capture configs/capture-staging-3.yaml'
    fi
    echo "https://website-staging-$server/" > data/server.txt
    config
}

任何帮助将不胜感激。谢谢,所有人Moe

您的想法是正确的,但是使事情比需要更难。您的脚本的初始部分很好,尽管我会证明cd成功,例如

    regressionfolder=~/path/to/folder
    cd "$regressionfolder" || {
        printf "error: unable to change to %sn" "$regressionfolder" >&2
        return 1
    }

(注意: 1的返回通常表示错误,并且始终 double Quote 您的变量(

检查"$server" != 1 ...之后,您需要做的就是将您的别名设置为$server作为数字。不需要其他if ... elif ...,例如

    if [ "$server" != 1 ] && [ "$server" != 2 ] && [ "$server" != 3 ]; then
        echo "Visual Regression Testing argument invalid - USAGE: regressiontest <server>"
        return 1
    fi
    alias config="wraith capture configs/capture-staging-$server.yaml"
    config
}

(注意:始终 double Quote 带有[...]的变量(

消除alias

不需要alias,您可以简单地运行:

wraith capture configs/capture-staging-$server.yaml

完全放置它,您可以做类似的事情:

function regressiontest {
    regressionfolder="$HOME/path/to/folder"
    cd "$regressionfolder" || {
        printf "error: unable to change to %sn" "$regressionfolder" >&2
        return 1
    }
    if [ $# -eq 0 ]; then
        echo "No arguments provided - USAGE: regressiontest <server>"
        return 1
    else
        server=$1
    fi
    if [ "$server" != 1 ] && [ "$server" != 2 ] && [ "$server" != 3 ]; then
        printf "Visual Regression Testing argument invalid - "
        printf "USAGE: regressiontest <server>n"
        return 1
    fi
    wraith capture "configs/capture-staging-$server.yaml"
}

(注意:也使用"$HOME"而不是~。虽然~将在命令行上展开,但您将在脚本中迅速遇到问题(

(

使用case语句

使用 case ... esac的较短的功能更凝结版本可能会好一些,例如

function regressiontest {
    regressionfolder="$HOME/path/to/folder"
    cd "$regressionfolder" || {
        printf "error: unable to change to %sn" "$regressionfolder" >&2
        return 1
    }
    case "$server" in
        [123]   )   wraith capture "configs/capture-staging-$server.yaml";;
            *   )   printf "Visual Regression Testing argument invalid - "
                    printf "USAGE: regressiontest <server>n"
                    return 1;;
    esac
}

我认为您不想声明别名,而是存储命令以供以后执行;只需从alias config='…'中删除"别名",然后通过$config拨打它。

最新更新