Как разобрать ключи в bash из командной строки? - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь сделать инструмент командной строки из сценария bash.Это очень просто:

grep ">" in_file >> out_file. 

Поэтому я хочу скопировать все строки, содержащие '>', из первого файла во второй.Мне нужен инструмент, который я мог бы запустить из командной строки следующим образом:

./tool.sh -input in_file -output out_file

-input и -output здесь для ключей.

Я попробовал код ниже:

while getopts "i:o:"
do
  case $Option in
          i)       input=$OPTARG;;
          o)     output=$OPTARG;; 
  esac
done

grep -n '>' input >> output

Но я получил ошибку: tool: input: Нет такого файла или каталога.

Что здесь не так?А также я хочу, чтобы ключ «in» мог принимать более одного аргумента.Как я могу это сделать ?Наверное, я не совсем правильно понимаю, как работает getopts, но я не нашел хорошего описания.

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Почему бы просто не сделать;

#!/bin/bash

grep ">" "$1" >> "out_file."

и затем вызвать как;

./tool.sh in_file

$1 - это позиционный параметр, то есть следующий аргумент после того, как скрипт становится входным файломимя.Если вы хотите разрешить пользователю сценария указывать outout, используйте второй позиционный параметр;

#!/bin/bash

grep ">" "$1" >> "$2"

и вызывайте как;

./tool.sh in_file out_file.

Чтобы добавить дополнительные аргументы, просто добавьтеболее позиционные параметры.

1 голос
/ 23 сентября 2019

Полагаю, я не совсем правильно понимаю, как работают getopts, но я не нашел хорошего описания.

В Bash getopts - это встроенная функция:

$ type -a getopts
getopts is a shell builtin

Его поведение описано в help getopts:

$ help getopts
getopts: getopts optstring name [arg]
    Parse option arguments.

    Getopts is used by shell procedures to parse positional parameters
    as options.
    (...)
    Each time it is invoked, getopts will place the next option in the
    shell variable $name,

Ваш скрипт не работает по 2 причинам - вы используете getopts неправильно и не добавляете имена переменных с $ чтобы получить их содержимое.Должно быть:

#!/usr/bin/env sh

while getopts "i:o:" Option
do
    echo in loop
    case "$Option" in
        i)     input="$OPTARG";;
        o)     output="$OPTARG";; 
    esac
done

echo input: "$input"
echo output: "$output"

grep -n '>' "$input" >> "$output"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...