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, это сэкономит вам много головной боли.