2015-05-15 2 views
1

Я просто столкнулся с проблемой, когда я пытался присвоить значение переменной внутри сазе, вот мой код:Невозможно присвоить значение переменной в случае заявления в Баш

#!/bin/bash 

while getopts ":m:n:::" opt; do 
    case $opt in 
    n) 

     echo "-n was triggered, Parameter: $OPTARG " >&2 
     case $OPTARG in 
     t) 
      echo threads 
      r=threads 
      ;; 
     p) 
      echo processes 
      r="something" 
      ;; 
     esac 
     ;; 
    m) 
     echo "-m was triggered, Parameter: $OPTARG" >&2 
     ;; 
    \?) 
     echo "Invalid option: -$OPTARG" >&2 
     exit 1 
     ;; 
    :) 
     echo "Option -$OPTARG requires an argument." >&2 
     exit 1 
     ;; 
    esac 
done 

echo $r 
echo No thread/processes: $2 P/T: $4 IF: $5 OF: $6 

Я бы хотел использовать переменную $r позже, но я не могу. Когда я пытаюсь распечатать его, используя echo (как и в моем скрипте), он ничего не возвращает. Я пытался определить свою ошибку, но не смог. Существует аналогичное сообщение, в котором предлагается удалить пробелы до и после =, но, как вы можете видеть, в моем месте нет пробелов.

Вот что я получаю от консоли, когда я запускаю его:

$ ./friendfind -n 2 -m p IN OUT 
-n was triggered, Parameter: 2 
-m was triggered, Parameter: p 
No thread/processes: 2 P/T: p IF: IN OF: OUT 

Цель сценария была запустить файл переменного тока с возможностью его запуска с потоками или процессами, поэтому он просит для количество процессов/потоков, которые вы хотите использовать, если вы хотите использовать процессы или потоки и файл ввода и вывода.

+4

'r' будет установлен только если вызов включает в себя' -nt' или '-np'. У вас есть '-n 2', поэтому' r' просто не будет установлен. Возможно, вы забыли случай по умолчанию во внутреннем случае? В противном случае объясните, почему вы ожидаете установки 'r'. – rici

+2

Кроме того, что вы ожидаете от трех двоеточий в конце строки опций? – rici

+0

Огромное вам спасибо, и жаль, что задал такой тупой вопрос. Я пытался получить более одного аргумента, но теперь я чувствую, что это тоже неправильно. – Stieg

ответ

0

Я думаю, что вы были направлены на что-то вроде этого:

#!/bin/bash 
# Print usage message: 
usage() { 
    echo "Usage: $0 [-n N] [-t|-p] INPUT OUTPUT" >> /dev/stdout 
} 
# Set default values 
n_threads=1 
use_threads=1 
while getopts "n:pth" opt; do 
    case $opt in 
    n) n_threads=$OPTARG;; 
    t) use_threads=1;; 
    p) use_threads=0;; 
    h) usage; exit 0;; 
    *) usage; exit 1;; 
    esac 
done 
# Get rid of scanned options 
shift $((OPTIND-1)) 
if (($# != 2)); then usage; exit 1; fi 
if ((use_threads)); then 
    echo "Using $n_threads threads. IF: $1; OF: $2" 
    # ... 
else 
    echo "Using $n_threads processes. IF: $1; OF: $2" 
    # ... 
fi 

Вот некоторые примеры вызовов, в том числе несколько ошибок:

$ ./ff -p foo bar 
Using 1 processes. IF: foo; OF: bar 
$ ./ff foo bar 
Using 1 threads. IF: foo; OF: bar 
$ ./ff -n 7 foo bar 
Using 7 threads. IF: foo; OF: bar 
$ ./ff -n 7 -p foo bar 
Using 7 processes. IF: foo; OF: bar 
$ ./ff -p -n7 foo bar 
Using 7 processes. IF: foo; OF: bar 
$ ./ff -q -n7 foo bar 
./ff: illegal option -- q 
Usage: ./ff [-n N] [-t|-p] INPUT OUTPUT 
# Note: The error message here could be more informative. 
# Exercise left for the reader 
$ ./ff -n 7 foo 
Usage: ./ff [-n N] [-t|-p] INPUT OUTPUT 
Смежные вопросы