Bash:否则不在case语句中使用if / else语句

时间:2017-02-16 16:19:58

标签: linux bash if-statement switch-statement

我正在尝试检查用户是否使用case和if / else语句在命令行中键入多个参数。错误的是我继续获取默认情况而不是相同的命令,但是还有2个参数。例如,我的一个条件是:

del)
    if [ -z "$2" ] || [ -z "$3" ]
    then
            echo "Usage: removes a file"
    else
    echo "using Bash command: rm $2 $3"
    rm $2 $3
    echo done
    fi

打印第一个条件,但是如果我键入,例如del aaa bbb,我会得到默认情况,即:

echo "ERROR: Unrecognized command"

如果有帮助的话,我也会用它来阅读用户的输入。

read -p "wcl> " -r wcl $2 $3

我真的不知道是否有更好的方法可以解决这个问题,而无需废弃我的所有代码并从头开始。 这是完整的代码:

#!/bin/bash
#use read command

echo Welcome to the Windows Command Line simulator!
echo Enter your commands below
while true
do
read -p "wcl> " -r wcl $2 $3
    case  $wcl  in
     dir)
    echo "using Bash command: ls  $2 $3"
    ls
    continue 
            ;;
    copy)
    FILE="$2"
    if [ "$#" -ne 3 ]
    then
         echo "Usage: copy sourcefile destinationfile"
    else
    echo "using Bash command: cp $2 $3"
    if [ -f "$FILE" ]
    then
    cp $2 $3
    else
    echo "cannot stat $FILE: No such file or directory">&2
    fi
    echo done
    fi
    continue
            ;;
    del)
    if [ -z "$2" ] || [ -z "$3" ]
    then
            echo "Usage: removes a file"
    else
    echo "using Bash command: rm $2 $3"
    rm $2 $3
    echo done
    fi
    continue
            ;;
    move)
    if [ -z "$2" ] || [ -z "$3" ]
    then
            echo "Usage: moves a file to another file name and location"
    else
    echo "using Bash command: mv $2 $3"
    mv $2 $3
    echo done
    fi
    continue
            ;;
    rename)
    if [ -z "$2" ] || [ -z "$3" ]
    then
            echo "Usage: renames a file"
    else
    echo "using Bash command: mv $2 $3"
    mv $2 $3
    echo done
    fi
    continue
            ;;
    ipconfig)
            ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
    continue
            ;;
      exit)
            echo "Goodbye"
            exit 1
            ;;
    ^c)
            echo "Goodbye"
            exit 1
            ;;
*)
            echo "ERROR: Unrecognized command"
    continue
esac
done

2 个答案:

答案 0 :(得分:0)

您无法使用read来设置位置参数,但不清楚为什么需要这里。只需使用常规参数。

while true
do
    read -p "wcl> " -r wcl arg1 arg2
    case  $wcl  in
     dir)
    echo "using Bash command: ls  $arg1 $arg2"
    ls "$arg1" "$arg2"
    continue 
            ;;

    # ...
    esac
done

执行read -r wcl $2 $3的方式是首先展开$2$3以提供read将用于设置变量的名称。如果没有设置,那么命令将减少到read -r wcl,因此您的整个命令行将分配给变量wcl,而不仅仅是命令。

但是,如果您的目标是编写自己的shell,read本身不会执行shell已经执行的相同解析。

答案 1 :(得分:0)

如果你真的使用bash,你可以通过数组将你读到的单词插入到位置参数中。 (您也可以将它们留在数组中,但引用位置参数的语法更简单。)

# -a: read the successive words into an array
read -r -p "wcl> " -a params
# set the positional parameters to the expansion of the array
set -- "${params[@]}" 
wcl=$1  # Or you could do the case on "$1"

这也会将$#设置为读取的单词数,作为设置位置参数的副作用。

作为@chepner points outsread是有问题的:它只是将输入拆分为以空格分隔的单词,而不考虑引号,反斜杠以及您可能想要实现的任何其他shell元字符。在bash中对命令行执行完全bash风格的解析将是一项非常困难的练习。