2014-08-27 4 views
0

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

$ sh ss9.sh -d u1 
mv: invalid option -- 'd' 

Я не знаю, что я сделал неправильно в своем сценарии.

+1

он должен быть 'case $ 1 in -d) ...' Удачи. – shellter

ответ

0

Isse - это то, что первый цикл повторяется по аргументам вашего скрипта и ожидает, что они будут каталогами. Но -d не является каталогом. Однако mv пытается обработать его как один, и это не сработает.

Решение может состоять в том, чтобы сначала проверить параметры (например, -d), а затем передать остальные аргументы в цикл for.

0

Ваш скрипт получил как аргументы: -d u1.

for dir in "[email protected]" #processing -d u1 
do 
mv "$dir"/* /tmp # here will get: mv -d/* /tmp 
done 

Вы должны обработать переключатели в начале. Для помощника см. getopt.

0

Первый цикл в вашем скрипте передает каждый аргумент в свою очередь команде mv, включая любые предназначенные для использования параметры. Ошибка, которую вы видите испускается, когда оболочка пытается выполнить команду

mv -d/* /tmp 

Если вы хотите, чтобы ваш скрипт для поддержки вариантов, а также непараметрических аргументов, то вам необходимо провести различие между ними.

0

Вы можете переупорядочить логику своего сценария, чтобы помочь вам справиться с каждым из ваших режимов работы без какой-либо одной опции, вызывающей проблемы с другим. Один из способов сделать это - обработать и ответить на все входящие в ваш оператор case. Пример:

#!/bin/bash 

[ -n "$1" ] || { 
    echo "Error: insufficient input. usage: ${0##*/} -d -x dirname" 
    exit 1 
} 

case "$1" in 
    -d) 
     mv -R $dir/* /tmp 
     ;; 
    -x) 
     find -executable -type f | xargs mv -t "$dir"/* /tmp 
     ;; 
    * ) 
     for dir in "[email protected]"; do 
      [ -e "$dir" ] && mv "$dir"/* /tmp 
     done 
     ;; 
esac 

exit 0 

Здесь вы проверяете, что у вас есть вход, если не предусмотрено использование и выход. Если есть вход, то если -d реагировать с mv, если -x реагировать с find, а затем, наконец, если ничего не соответствует, используйте default случай заявление к материалу теста если ваш входной файл/реж, что существует, и если поэтому, затем mv. Это один из способов переупорядочения. (Примечание: я использовал ваши команды без дальнейшего тестирования :)

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