Script para escolher o editor para abrir o arquivo com base no argumento

2

Gostaria de executar meu script fastex com dois argumentos possíveis ( g ou t ), como fastex g .

Com base no argumento que desejo chamar geany $file ou texstudio $file . Isso é para escolher o editor.

Eu tentei

editor=$1
if ["$1" = "g"]; then
geany "$file".tex
exit 1
else
linha=$(wc -l < "$file".tex)
texstudio --line $linha  "$file".tex
exit 1
fi

mas a saída de fastex.sh g é /usr/bin/fastex.sh: 31: [g: not found e sempre abre texstudio . O mesmo se eu passar t .

    
por Sigur 11.01.2013 / 20:13

2 respostas

3
  1. Você precisa de espaço após if [ porque [ é realmente um comando (como test ) que lê seus argumentos (pode ser interpretado pelo shell, mas pode não ser). Usar [[ garante que a lógica interna do shell seja usada (mais rápido, já que nenhum novo processo é iniciado). Embora os shells possam interpretar os [ e test como internos, esse recurso pode ser desativado com enable (e, em seguida, um novo processo realmente é iniciado).

  2. = é o operador de comparação dentro de expressões condicionais (externas e internas), mas também é o operador de atribuição em outro lugar. Embora test e = estejam em conformidade com POSIX, usar == (reconhecido em [[ ) parece ser uma escolha razoável sempre que não se deseja conformidade com POSIX, pois traz um pouco mais de sanidade à inconsistência do shell do significado dependente do contexto de = .

  3. exit 1 - por que descartar efetivamente o valor de retorno do editor? Deixe-o fora completamente ou use exec para substituir o script pelo editor.

#!/bin/bash
editor=$1
if [[ "$1" == "g" ]]; then
    exec geany "$file.tex"
else
    linha=$(wc -l < "$file.tex")
    exec texstudio --line $linha  "$file.tex"
fi
    
por 11.01.2013 / 20:42
2
if ["$1" = "g"]; then

Você precisa de espaços dentro de [ e ] , pois eles são analisados como comandos comuns. De fato, [ é um comando comum (que é embutido na maioria dos shells).

exit 1

Por que você está saindo com um status de erro depois de executar o editor? Um status de retorno de 0 significa sucesso, qualquer outra coisa significa falha. Você deve fazer seu script retornar o mesmo status do editor. Conforme escrito, você pode deixar exit no total: quando o shell atinge o final do script, ele encerra a execução do script e retorna o status do último comando que foi executado.

Como um refinamento, você pode usar o exec builtin . que, em vez de executar o editor como um subprocesso, seu script terminará e será substituído pelo editor. (O mesmo processo continua sendo executado, mas seu código muda para o do outro programa.) Mas não faça isso se você fizer isso uma função e não um script!

Uma construção case seria mais clara para expressar que você está baseando sua condição no valor de uma variável específica.

#!/bin/sh
editor=$1 file=$2
case "$editor" in
  g) exec geany "$file".tex;;
  *)
    linha=$(wc -l < "$file".tex)
    exec texstudio --line "$linha" "$file.tex";;
esac
    
por 12.01.2013 / 01:15