2015-10-02 4 views
-1

у меня есть домашнее задание, написать программу schedsim.sh с:Ошибка с getopts в оболочке

schedsim.sh [-h] [-c x] -i filename 

В этом:

-h: печать имени пользователя

-c: печать х + 1 (х введенный с клавиатуры), если не ввести x, распечатать 1

-i: Размер файла имени файла, имя файла - это имя файла, который вступил.

Мой код:

#i/bin/bash/ 

while getopts ":hc:i:" Option 
do 
    case $Option in 
    h) 
    whoami 
    ;; 
    c) a=$OPTARG 
    if [ -z "$a" ]; then 
     a=1 
    else 
     a=`expr $a + 1` 
    fi 
    echo $a 
    ;; 
    i) echo 'Size of file: Kylobytes' 
    ls -s $OPTARG 
    ;; 
    *) echo 'sonething wrong' 
    ;; 
    esac 
done 

Однако, когда я называю:

./schedsim.sh -c -i abc.txt 

Ошибка.

Извините, мой английский плохой!

+2

Первое, что я вам скажу, это то, что ваша «shebang» на первой строке неверна. Это не должно быть '#i ...' Оно должно иметь восклицательный знак '!' Вместо 'i'. Как и в, это должно быть '#! ...'. –

+2

** Что ** ошибка вы получаете, когда называете это? Работает ли какой-либо из параметров? Неужели 'getopts' сам не работает? –

+1

Возможный дубликат [Bash Script с аргументом анализа в Linux] (http://stackoverflow.com/questions/32826395/bash-script-with-parsing-argument-in-linux) –

ответ

0

Похоже, что у вас был базовый сценарий, близкий к рабочему. Я сделал несколько изменений, таких как добавление теста на существование указанного пользователем файла, прежде чем пытаться запустить на нем ls и добавить кавычки вокруг переменных. Я предлагаю попросить вашего учителя, как они хотели бы, чтобы вы вычислили килобайты в том районе, где вы используете ls. du или stat может быть лучше для этого варианта использования.

#!/bin/bash/ 

while getopts ":hc:i:" Option 
do 
    case "$Option" in 
    h) whoami 
     ;; 
    c) a=$(($OPTARG + 1)) 
     printf "$a\n" 
     ;; 
    i) if ! [ -f "$OPTARG" ] 
     then printf "File does not exist\n" 
     else printf "Size of file: Kylobytes: " 
      ls -s "$OPTARG" 
      printf "\n" 
     fi 
     ;; 
    *) printf "something wrong\n" 
     ;; 
    esac 
done 

Еще одно изменения я сделал было использовать $(()) оболочку арифметики вместо expr. Как правило, если нужна более мощная математика, чем $(()), они могут поддерживать их в bc (который поддерживает вычисления с плавающей запятой) вместо expr.

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