Script в Bash

Я пытаюсь создать оболочку script, которая должна использоваться следующим образом:

ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

script затем преобразует файл изображения в текстовый файл. Вот что я придумал до сих пор:

#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1

Но я не знаю, как получить значения -from и -to. Любые идеи о том, как это сделать?

Ответ 1

Аргументы, которые вы предоставляете bashscript, будут отображаться в переменных $1 и $2 и $3, где число ссылается на аргумент. $0 - это сама команда.

Аргументы разделяются пробелами, поэтому, если вы предоставите команды -from и -to в команде, они тоже попадут в эти переменные, поэтому для этого:

./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

Вы получите:

$0    # ocrscript.sh
$1    # -from
$2    # /home/kristoffer/test.png
$3    # -to
$4    # /home/kristoffer/test.txt

Может быть проще опустить -from и -to, например:

ocrscript.sh /home/kristoffer/test.png /home/kristoffer/test.txt

Затем вы получите:

$1    # /home/kristoffer/test.png
$2    # /home/kristoffer/test.txt

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

Затем вы можете сделать:

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

Двойные кавычки вокруг $1 и $2 не всегда необходимы, но рекомендуются, потому что некоторые строки не будут работать, если вы не поместите их между двойными кавычками.

Ответ 2

Если вы не полностью привязаны к использованию "от" и "к" в качестве имен своих опций, довольно просто реализовать это с помощью getopts:

while getopts f:t: opts; do
   case ${opts} in
      f) FROM_VAL=${OPTARG} ;;
      t) TO_VAL=${OPTARG} ;;
   esac
done

getopts - это программа, которая обрабатывает аргументы командной строки и удобно анализирует их для вас.

f:t: указывает, что вы ожидаете 2 параметра, которые содержат значения (обозначенные двоеточием). Что-то вроде f:t:v говорит, что -v будет интерпретироваться только как флаг.

opts где текущий параметр сохраняется. Оператор case - это то, где вы будете обрабатывать это.

${OPTARG} содержит значение, следующее за параметром. ${FROM_VAL}, например, получит значение /home/kristoffer/test.png, если вы запустили свой script как:

ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt

Как утверждают другие, если вы впервые пишете сценарии bash, вы должны действительно прочитать некоторые основы. Это было просто краткое руководство по работе getopts.

Ответ 3

Используйте переменные "$1", "$2", "$3" и т.д. для доступа к аргументам. Чтобы получить доступ ко всем из них, вы можете использовать "[email protected]" или получить количество аргументов $# (может быть полезно проверить слишком мало или слишком много аргументов).

Ответ 4

Мне нужно было убедиться, что мои скрипты полностью переносимы между различными машинами, оболочками и даже версиями cygwin. Кроме того, мои коллеги, которых я должен был написать для скриптов, являются программистами, поэтому я в итоге использовал это:

for ((i=1;i<=$#;i++)); 
do

    if [ ${!i} = "-s" ] 
    then ((i++)) 
        var1=${!i};

    elif [ ${!i} = "-log" ];
    then ((i++)) 
        logFile=${!i};  

    elif [ ${!i} = "-x" ];
    then ((i++)) 
        var2=${!i};    

    elif [ ${!i} = "-p" ]; 
    then ((i++)) 
        var3=${!i};

    elif [ ${!i} = "-b" ];
    then ((i++)) 
        var4=${!i};

    elif [ ${!i} = "-l" ];
    then ((i++)) 
        var5=${!i}; 

    elif [ ${!i} = "-a" ];
    then ((i++)) 
        var6=${!i};
    fi

done;

Обоснование: я включил a launcher.sh script, так как вся операция имела несколько шагов, которые были квазинезависимы друг от друга (я говорю "квази", потому что хотя каждый script может быть запущен они, как правило, все работали вместе), и через два дня я узнал, что около половины моих коллег, будучи программистами и всеми, были слишком хороши, чтобы использовать файл запуска, следовать "использованию" или читать HELP, который отображался каждый раз, когда они делали что-то неправильно, и они делали беспорядок в целом, запускали сценарии с аргументами в неправильном порядке и жаловались, что скрипты не работают должным образом. Я холерик, я решил перестроить все свои сценарии, чтобы убедиться, что они являются коллегами. Первый сегмент кода был первым.

Ответ 5

В bash $1 - первый аргумент, переданный во второй раз script, $2 и т.д.

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

Итак, вы можете использовать:

./your_script.sh some_source_file.png destination_file.txt

Объяснение о двойных кавычках

рассмотрим три сценария:

# foo.sh
bash bar.sh $1

# cat foo2.sh
bash bar.sh "$1"

# bar.sh
echo "1-$1" "2-$2"

Теперь вызовите:

$ bash foo.sh "a b"
1-a 2-b

$ bash foo2.sh "a b"
1-a b 2-

При вызове foo.sh "a b" он вызывает bar.sh a b (два аргумента), а при foo2.sh "a b" он вызывает bar.sh "a b" (1 аргумент). Всегда имейте в виду, как параметры передаются и расширяются в bash, это сэкономит вам много головной боли.