Я пытаюсь создать сценарий оболочки, который следует использовать следующим образом:
ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt
Затем сценарий ocr преобразует файл изображения в текстовый файл. Вот что я до сих пор придумал:
#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1
Но я не знаю , как получить -from
и -to
значение. Есть идеи, как это сделать?
linux
bash
shell
parameters
Кристоффер
источник
источник
Ответы:
Аргументы , которые вы предоставляете в bashscript появятся в переменных
$1
и$2
и$3
где число относится к аргументу.$0
это сама команда.Аргументы разделяются пробелами, поэтому, если вы укажете
-from
и-to
в команде, они тоже окажутся в этих переменных, поэтому для этого:Ты получишь:
Было бы проще опустить
-from
и-to
, например:Тогда у вас будет:
Обратной стороной является то, что вам придется поставлять его в правильном порядке. Существуют библиотеки, которые могут упростить анализ именованных аргументов в командной строке, но обычно для простых сценариев оболочки вы должны просто использовать простой способ, если это не проблема.
Тогда вы сможете:
Двойные кавычки вокруг
$1
и$2
не всегда необходимы, но рекомендуется, потому что некоторые строки не будут работать, если вы не поместите их между двойными кавычками.источник
Если вы не совсем привязаны к использованию «from» и «to» в качестве имен опций, довольно легко реализовать это с помощью getopts :
getopts
это программа, которая обрабатывает аргументы командной строки и анализирует их за вас.f:t:
указывает, что вы ожидаете 2 параметра, которые содержат значения (обозначенные двоеточием). Что-то вродеf:t:v
говорит, что-v
это будет интерпретироваться только как флаг.opts
где хранится текущий параметр. Вcase
заявлении вы будете это обрабатывать.${OPTARG}
содержит значение, следующее за параметром.${FROM_VAL}
например, получит значение,/home/kristoffer/test.png
если вы запустили свой скрипт, например:ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt
Как предлагают другие, если вы впервые пишете сценарии bash, вам действительно стоит прочитать некоторые основы. Это было просто краткое руководство о том, как это
getopts
работает.источник
f:t:vs
будет-f some_f -t some_t -v -s
Используйте переменные
"$1"
,"$2"
,"$3"
и так далее аргументы доступа. Для доступа ко всем из них вы можете использовать"$@"
или для получения количества аргументов$#
(может быть полезно проверить слишком мало или слишком много аргументов).источник
Мне нужно было убедиться, что мои скрипты полностью переносимы между различными машинами, оболочками и даже версиями cygwin. Кроме того, мои коллеги, для которых мне пришлось писать сценарии, были программистами, поэтому в итоге я использовал это:
Обоснование: я также включил
launcher.sh
сценарий, так как вся операция состояла из нескольких шагов, которые были квазинезависимыми друг от друга (я говорю «квази», потому что, хотя каждый сценарий мог запускаться отдельно, они обычно выполнялись вместе. ), и через два дня я узнал, что примерно половина моих коллег, программистов и все такое, были слишком хороши, чтобы использовать файл пусковой установки, следить за «использованием» или читать СПРАВКУ, которая отображалась каждый раз, когда они что-то делали. неправильно, и они все испортили, запускали сценарии с аргументами в неправильном порядке и жаловались, что сценарии не работают должным образом. Поскольку я холерик, я решил переделать все свои скрипты, чтобы убедиться, что они защищены от коллег. Приведенный выше сегмент кода был первым.источник
В bash
$1
это первый аргумент, переданный скрипту,$2
второй и т. Д.Итак, вы можете использовать:
Пояснение к двойным кавычкам;
рассмотрим три сценария:
Теперь вызовите:
Когда вы вызываете,
foo.sh "a b"
он вызываетbar.sh a b
(два аргумента), а вместе сfoo2.sh "a b"
ним вызываетbar.sh "a b"
(1 аргумент). Всегда помните, как параметры передаются и раскрываются в bash, это избавит вас от много головной боли.источник