Estou tentando fazer um script de shell que deve ser usado assim:
ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt
O script irá então converter o arquivo de imagem em um arquivo de texto. Aqui está o que eu descobri até agora:
#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1
Mas não sei como obter os valores -from
e -to
. Alguma ideia de como fazer isso?
linux
bash
shell
parameters
Kristoffer
fonte
fonte
Respostas:
Os argumentos que você fornece para um bashscript aparecerão nas variáveis
$1
e$2
e$3
onde o número se refere ao argumento.$0
é o próprio comando.Os argumentos são separados por espaços, portanto, se você fornecer o
-from
e-to
no comando, eles terminarão nessas variáveis também, para isso:Você terá:
Pode ser mais fácil omitir o
-from
e o-to
, como:Então você terá:
A desvantagem é que você terá que fornecê-lo na ordem certa. Existem bibliotecas que podem tornar mais fácil analisar argumentos nomeados na linha de comando, mas geralmente para scripts de shell simples, você deve usar o caminho mais fácil, se não houver problema.
Então você pode fazer:
As aspas duplas em torno de
$1
e$2
nem sempre são necessárias, mas são recomendadas, porque algumas strings não funcionarão se você não as colocar entre aspas duplas.fonte
Se você não estiver completamente apegado ao uso de "from" e "to" como nomes de opções, é bastante fácil implementar isso usando getopts :
getopts
é um programa que processa argumentos de linha de comando e os analisa convenientemente para você.f:t:
especifica que você está esperando 2 parâmetros que contêm valores (indicados por dois pontos). Algo comof:t:v
diz que-v
só será interpretado como uma bandeira.opts
é onde o parâmetro atual é armazenado. Acase
declaração é onde você processará isso.${OPTARG}
contém o valor após o parâmetro.${FROM_VAL}
por exemplo, obterá o valor/home/kristoffer/test.png
se você executou seu script como:ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt
Como os outros estão sugerindo, se esta é sua primeira vez escrevendo scripts bash, você deve realmente ler alguns princípios básicos. Este foi apenas um rápido tutorial de como
getopts
funciona.fonte
f:t:vs
, será-f some_f -t some_t -v -s
Use as variáveis
"$1"
,"$2"
,"$3"
e assim por diante para argumentos de acesso. Para acessar todos eles, você pode usar"$@"
ou para obter a contagem de argumentos$#
(pode ser útil verificar se há poucos ou muitos argumentos).fonte
Eu precisava ter certeza de que meus scripts são totalmente portáveis entre várias máquinas, shells e até mesmo versões do cygwin. Além disso, meus colegas, para quem eu tive que escrever os scripts, são programadores, então acabei usando isto:
Fundamentação da petição: também incluí um
launcher.sh
script, uma vez que toda a operação tinha vários passos que eram quase independentes entre si (estou a dizer "quase", porque embora cada script pudesse ser executado sozinho, normalmente eram todos executados juntos ), e em dois dias eu descobri que cerca de metade dos meus colegas, sendo programadores e todos, eram bons demais para usar o arquivo do iniciador, seguir o "uso" ou ler a AJUDA que era exibida toda vez que eles faziam algo errados e eles estavam bagunçando tudo, executando scripts com argumentos na ordem errada e reclamando que os scripts não funcionavam corretamente. Sendo o colérico que sou, decidi revisar todos os meus scripts para ter certeza de que são à prova de colegas. O segmento de código acima foi a primeira coisa.fonte
Em bash
$1
é o primeiro argumento passado para o script, o$2
segundo e assim por dianteEntão você pode usar:
Explicação sobre aspas duplas;
considere três scripts:
Agora invoque:
Quando você invoca
foo.sh "a b"
, ele invocabar.sh a b
(dois argumentos) e, comfoo2.sh "a b"
ele,bar.sh "a b"
(1 argumento). Sempre tenha em mente como os parâmetros são passados e expandidos no bash, isso o salvará de muitas dores de cabeça.fonte