【问题标题】:How to pass parameters using command line arguments in shell script如何在 shell 脚本中使用命令行参数传递参数
【发布时间】:2016-07-04 21:28:49
【问题描述】:

我是 shell 脚本的新手,我正在为 jmeter 编写 shell 脚本。到目前为止,为了运行 jmeter 脚本,我编写了如下的 shell 脚本:

#! bin/sh    
start(){
    echo "Please enter the file name .jmx extension"
    read file

echo "Please enter the log file name .jtl extension"
read log_file

jmeter.sh -n -t $file -l $log_file
}
while [ "$1" != "" ]; do
case "$1" in
        start )
            start
            ;;
         *)
            echo $"Usage: $0 {start|stop}"
            exit 1
        esac
   shift
done

我有一个停止方法来终止进程。在这里,对于这个脚本,我要求用户在不同的行中输入.jmx 文件名和.jtl 文件名。但我希望用户在键入命令执行脚本时能够传递.jmx 文件名和.jtl 文件名。

例如:$ ./script.sh .jmx fileName .jtl fileName 那么,脚本应该运行。

我不知道该怎么做。有人可以帮忙吗?

【问题讨论】:

    标签: linux bash shell jmeter scripting-language


    【解决方案1】:

    由于read 从标准输入读取,您需要在标准输入上传递文件名:

    { echo "file.jmx"; echo "file.jtl"; } | ./script.sh start
    

    使用 here-document 可以更整洁:

    ./script.sh start <<END_INPUT
    file.jmx
    file.jtl
    END_INPUT
    

    一点代码回顾:如果用法只需要一个参数,“start”或“stop”,你不需要while循环:

    #!/bin/sh
    
    do_start_stuff() { ... }
    do_stop_stuff() { ... }
    
    case "$1" in 
        start) do_start_stuff;;
        stop)  do_stop_stuff;;
        *)     echo "Usage: $0 {start|stop}"; exit 1;;
    esac
    

    重写脚本以获取所有参数:

    #!/bin/sh
    
    usage() {
        echo "Usage $0 {start ...|stop}"
        # provide more info about arguments for the start case
        # provide an example usage
    }
    
    case "$1" in 
        stop) do_stop_stuff ;;
        start)
            shift
            if [ "$#" -ne 4 ]; then usage; exit 1; fi
            jmeter.sh -n -t "$1" "$2" -l "$3" "$4"
            ;;
        *) usage ;;
    esac
    

    【讨论】:

    • 我想使用像 $ ./script.sh .jmx fileName .jtl fileName 这样的单行命令运行脚本,因为脚本完成后,我将从 jenkins 运行参数化脚本。
    • 谢谢。这工作正常。我正在使用while,因为我还有其他一些方法,您能告诉我如何使用您在method 中提供的start 答案并在while 循环中调用该方法
    • 当我尝试运行它时,它显示can't shift that many。你能帮忙解决这个问题吗?我在脚本中有超过 4 个函数,所以我使用 while loop,我在函数中提供了 start 代码并在 while loop 中调用它
    • 我认为你不需要 while 循环。假设您的脚本采用子命令“start”、“stop”、“status”和“restart”。暂时忽略任何子命令参数,只有当您想在单次运行期间处理多个子命令时,while 循环才有意义(例如 script stop start status) - IMO 这是一个糟糕的 UI。你不要说git add commit push checkout merge。保持简单。只处理一个子命令,让用户调用两次脚本(script restart &amp;&amp; script status
    • 现在,我已经像start(){ shift if [ "$#" -ne 2 ]; then exit 1; fi jmeter.sh -n -t "$1" -l "$2" } 一样编辑了我的脚本,并使用case "$1" in stop) stop ;; *) usage ;; esac 调用了该方法,这是行不通的。我想知道我怎样才能拥有一个method,它采用command line arguments 并在case 中调用它。你能告诉我吗
    最近更新 更多