2010-05-23 3 views
3

Я хочу, чтобы пользователь вводил что-то в командной строке либо -l или -e. , т.е. . $/Report.sh -e Я хочу, если заявление, чтобы разделить то, что решение, которое они делают, так что я попробовал ...Как сравнить 2 строки в оболочке?

if [$1=="-e"]; echo "-e"; else; echo "-l"; fi 

явно не работает, хотя Благодаря

ответ

9

Я использую:

if [[ "$1" == "-e" ]]; then 
    echo "-e" 
else 
    echo "-l"; 
fi 

Однако аргументы синтаксического анализа, getopts может сделать вашу жизнь проще:

while getopts "el" OPTION 
do 
    case $OPTION in 
     e) 
      echo "-e" 
      ;; 
     l) 
      echo "-l" 
      ;; 
    esac 
done 
+0

Вы говорите, что «Getopt» и «getopts». Это две разные вещи. Первый - это отдельный исполняемый файл, а второй - встроенная оболочка. –

+0

D'oh - исправлено. Благодарю. –

3

Если вы хотите все это на одной линии (обычно это делает его трудно читать):

if [ "$1" = "-e" ]; then echo "-e"; else echo "-l"; fi 
1

Вам нужно пространство между квадратными скобками и то, что происходит внутри них. Кроме того, просто используйте один =. Вам также нужен then.

if [ $1 = "-e" ] 
then 
    echo "-e" 
else 
    echo "-l" 
fi 

Проблема специфичны для -e, однако, что это имеет особое значение в echo, так что вы вряд ли получите что-нибудь обратно. Если вы попробуете echo -e, вы ничего не увидите распечатать, а echo -d и echo -f сделайте то, что вы ожидаете. Поместите пробел рядом с ним или заключите его в скобки или используйте другой способ сделать это не точно -e при отправке на echo.

1

Если вы хотите распечатать только тот параметр, который пользователь отправил, вы можете просто использовать echo "$1". Если вы хотите вернуться к значению по умолчанию, если пользователь ничего не отправил, вы можете использовать echo "${1:--l} (:- - синтаксис Bash для значений по умолчанию). Тем не менее, если вы хотите действительно мощное и гибкое управление аргументами, вы можете посмотреть в getopt:

params=$(getopt --options f:v --longoptions foo:,verbose --name "my_script.sh" -- "[email protected]") 

if [ $? -ne 0 ] 
then 
    echo "getopt failed" 
    exit 1 
fi 

eval set -- "$params" 

while true 
do 
    case $1 in 
     -f|--foo) 
      foobar="$2" 
      shift 2 
      ;; 
     -v|--verbose) 
      verbose='--verbose' 
      shift 
      ;; 
     --) 
      while [ -n "$3" ] 
      do 
       targets[${#targets[*]}]="$2" 
       shift 
      done 
      source_dir=$(readlink -fn -- "$2") 
      shift 2 
      break 
      ;; 
     *) 
      echo "Unhandled parameter $1" 
      exit 1 
      ;; 
    esac 
done 

if [ $# -ne 0 ] 
then 
    error "Extraneous parameters." "$help_info" $EX_USAGE 
fi 
Смежные вопросы