2017-02-16 5 views
0

Я пытаюсь проверить, использует ли пользователь несколько аргументов в командной строке с использованием аргументов case и if/else. Что не так, я продолжаю получать случай по умолчанию вместо одной и той же команды, но с еще двумя аргументами. Например, один из моих условий:Bash: Else не работает в if/else в заявлении case

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 

печатает первое условие, но если я типа, скажем, дель ааа ГЭБ, я получаю случай по умолчанию, а именно:

echo "ERROR: Unrecognized command" 

Я m также используя это, чтобы прочитать ввод пользователя, если это помогает.

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 
+0

Лучший способ проверить количество аргументов командной строки - проверить '$ #', например. 'if (($ # <2))'. – cdarke

+0

Вам нужно показать остальную часть вашего кода, в частности часть 'case .. in'. – SiKing

ответ

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, а не только команде.

Однако, read сам по себе не собирается делать тот же синтаксический разбор, что и оболочка, если вы хотите написать свою собственную оболочку.

+0

Я пробовал это, и теперь он просто печатает первое условие вместо условия else, то есть «echo» Usage: ... »вместо« using ... » – anon

+0

Это потому, что' $ # 'не влияет на' read 'вообще. Весь ваш подход нуждается в переосмыслении. – chepner

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 outs, то read проблематично: Это просто разбивает ввод в пробельных слов, разделенных, не уважая цитаты, обратную косую черту, и любые другие метасимволы оболочки вы можете реализовать. Выполнение полного разбора командной строки в bash в стиле bash было бы довольно сложным упражнением.

Смежные вопросы