2016-08-11 1 views
0

Код, который я разработал вчера, принимает в качестве входного файла либо файл (x.txt), либо пробел (434 435 436 437), а также толкает данные случай в массиве и проходит через.Запуск оболочкиScript с флагами для аргументов командной строки

Syntax: shtest.sh 434 435 436 or sh test.sh x.txt 

MYFILE=$1 ; 
OLDIFS=$IFS; 
IFS=' '; 

if [ -f "$MYFILE" ]; then 
    testCases=($(cat $MYFILE)); 
else 
    testCases=([email protected]); 
fi 
for testCase in "${testCases[@]}" 
do 
    echo "Running Testcases $testCase" 
done 

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

  1. Я хотел бы на самом деле иметь флаг во время работы над скрипт с файлом как paramenter

    ш test.sh -f myfile.txt

    или Может быть запущена с -t flasg с числами в качестве аргументов

    ш test.sh -t 435 436 434

  2. , если оба -f и -t существуют, то я должен проверить и выдаст ошибку
    пример: ш test.sh -f -t myFile.sh 343 435 435 или ш test.sh -t 343 435 435 -f myFile.sh

Я начал работать на Shell Scripting только вчера, и IAM действительно короткий, как сделать это синтаксически

Наконец, Если мы указали файл с флагом или аргументом с флагом (No Unfalgged вообще), будет ли код ниже работать или будет иметь любые вопросы Синтаксис:

sh test.sh -f myFile.txt    #should work 
sh test.sh -t 443 444 443 443  # should work 
sh test.sh -f myFile.txt -t 443 444 443 443 # should fail 


isFile=0; 
isTest=0; 

while getopts ":f:c:t:" opt; do 
     case $opt in 
     f) 
      echo "-f was triggered, Parameter: $OPTARG" >&2 
      testCases=($(cat $OPTARG)); 
      isFile=1; 
      ;; 
     t) 
      # testCases=([email protected]); 
      multi+=("$OPTARG") 
      for val in "${multi[@]}"; do 
        echo " - $val" 
      done 
      ;; 
     c) 
      echo "-c was triggered, Parameter: $OPTARG" >&2; 
      isTest=1; 
      ;; 
     \?) 
      echo "Invalid option: -$OPTARG" >&2 
      exit 1 
      ;; 
     :) 
      echo "Option -$OPTARG requires an argument." >&2 
      exit 1 
      ;; 
     esac 
    done 

# Exit if both flags are sent 
if [ isTest==1 && isFile==1 ]; then 
{ 
    echo "Exiting"; 
} 
fi 

#if the flag is not avaiable, the store the orphan numbers (Command Line Arguments) 


for testCase in "${testCases[@]}" 
do 
    echo "Running Testcases $testCase" 
done 

Пожалуйста, советы и любая помощь приветствуется.

Благодаря Tejas

ответ

0

После цикла while getopts, добавьте:

shift $(($OPTIND - 1)) 

if [ $isFile = 0 ] && [ $# = 0 ] 
then 
    echo "$0: must specify file (-f file) or numbers" >&2 
    exit 1 
fi 

Я предполагаю, что у вас есть isFile=0 до вашего цикла. Если вы не установите его явно, вы можете наследовать переменную среды, которую пользователь случайно установил. Всегда будьте осторожны, чтобы вы случайно не использовали переменные среды из кода, который вызывает ваш скрипт.

+0

Что делает сдвиг $ (($ OPTIND - 1)), и что, если есть флаги для обоих чисел и файлов ... Написал новый код для этого сценария. Check check and advice – user2256825

+0

«shift» удаляет параметры которые были использованы «getopts» из '' $ @ "' (список позиционных параметров), оставляя только аргументы без опционов. Показанный код уже принимает как файл, так и некоторые числа; он требует только файл или некоторые номера, но не диагностирует как файл, так и некоторые номера. Отрегулируйте тесты в соответствии с вашими потребностями. –

+0

Да, теперь требование имеет флаги для обоих чисел и файла. Я попробую взглянуть на код ур и поменю на меня соответствующим образом, спасибо – user2256825

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