代码之家  ›  专栏  ›  技术社区  ›  Manish Kumar

Shell脚本未正确读取可选参数

  •  0
  • Manish Kumar  · 技术社区  · 6 年前

    我有这个脚本文件:

    #!/bin/sh
    
    Show_Error() {
            echo -e "\033[31m ERROR \033[0m $1"
    }
    
    if [ "$1" = "-help" ]
    then
        echo "<input> - input file name or input URL"
    else
    
    
    for i in "$@"
    do
    case $i in
        -l=*|--ddloc=*)
        DDLOC="${i#*=}"
        shift # past argument=value
        ;;
        -l|--ddloc)
        shift # past argument
        DDLOC="$1"
        shift # past value
        ;;
        *)
              # unknown option
        ;;
    esac
    done
    
    if [ -z "$DDLOC" ]
    then
           Show_Error 'File is missing. Use -l or --ddloc.'
    else
    echo "Location::: $DDLOC"
    fi
    fi
    

    ./tdl2ddlgen.sh -s sssss -m lll -l LOC

    "Location::: sssss" 国际贸易组织 "Location::: LOC"

    1 回复  |  直到 6 年前
        1
  •  1
  •   jhnc    6 年前

    你可以考虑一下 for i in "$@" 从中复制所有值 $@ $i 依次给每个人。您可以通过检测代码来观察正在发生的事情:

    for i in "$@"
    do
    echo "\$i = $i; \$@ = ($@)"
    case $i in
        # ...
    

    输出:

    $i = -s; $@ = (-s sssss -m 111 -l LOC)
    $i = sssss; $@ = (-s sssss -m 111 -l LOC)
    $i = -m; $@ = (-s sssss -m 111 -l LOC)
    $i = 111; $@ = (-s sssss -m 111 -l LOC)
    $i = -l; $@ = (-s sssss -m 111 -l LOC)
    $i = LOC; $@ = (-m 111 -l LOC)
    Location::: sssss
    

    实际上出了问题的是你没有离开 $1 当你得到一个未知的

    for i in "$@"
    do
    echo "\$i = $i; \$@ = ($@)"
    case $i in
        -l=*|--ddloc=*)
        DDLOC="${i#*=}"
        shift # past argument=value
        ;;
        -l|--ddloc)
        shift # past argument
        DDLOC="$1"
        shift # past value
        ;;
        *)
              # unknown option
        shift
        ;;
    esac
    done
    

    然后您将得到您期望的结果:

    $i = -s; $@ = (-s sssss -m 111 -l LOC)
    $i = sssss; $@ = (sssss -m 111 -l LOC)
    $i = -m; $@ = (-m 111 -l LOC)
    $i = 111; $@ = (111 -l LOC)
    $i = -l; $@ = (-l LOC)
    $i = LOC; $@ = ()
    Location::: LOC
    

    尽管这种行为仍然不太正确- LOC 对于循环,可以执行以下操作:

    while [ -n "$1" ]
    do
    case $1 in
        # ...