Condicionais não funcionam em. ./script [fechado]

0

Estou tentando fazer scripts de manipulação de arquivos de histórico.

Quando tento, por exemplo, implementar um modo anônimo executando

unset HISTFILE

Não funciona devido ao comando em execução no novo shell. Quando eu tento

. ./script

O comando funciona, mas as condicionais que eu uso para processar os argumentos passados para o script causam erro de sintaxe.

Existe alguma solução para isso? Resolvido: o problema foi o uso de condicionais errados e a não adaptação do script para zsh.

case $1 in
    (set)
        HISTFILE=$2
        HISTFILESIZE=$3
        ;;
    (incognito)
        unset HISTFILE
        ;;
    (removesizelimit)
        HISTSIZE=-1
        HISTFILESIZE=-1
        ;;
    (clear)
        rm -f $HISTFILE
        unset HISTFILE && exit
        ;;
    (backup)
        tar -cf HISTFILE.tar $HISTFILE
        ;;
    ("")
        echo "Usage:"
        echo " . ./history <option>"
        echo " . ./history set <HISTSIZE> <HISTFILESIZE>"
        echo
        echo "Manipulate history file"
        echo
        echo "Options:"
        echo -e " incognito\t\t\tdo not record history of commands in this session"
        echo -e " removesizelimit\t\tremove limitation of size of history file"
        echo -e " clear\t\t\t\tclear history of run commands"
        echo -e " backup\t\t\t\tclear create a backup of history file in archive"
        ;;
    (*)
        echo "ERROR: Option unrecognized"
        echo
        echo "run . ./history for help"
esac
    
por rkhunter 18.01.2016 / 23:38

1 resposta

0

n.b. a maior parte desta resposta fez muito mais sentido antes da edição da questão:)

O erro é simples:

if [ "$1" == "proto" ]; then
    TESTVAR=
if [ "$1" == "set" ]; then
    HISTFILE=$2
    HISTFILESIZE=$3
elif [ "$1" == "incognito" ]; then
# ....

O segundo if aqui deve ser elif . bash está reclamando porque não consegue encontrar fi correspondente.

Há também duas outras coisas que gostaria de mencionar sobre o script:

  1. Isso será executado em uma subshell e executará a saída do comando unset , que não é o que você deseja:

    $(unset HISTFILE)
    

    Você deve remover o operador $(...) dele.

  2. O #!/bin/bash implica que o script é executável como um argumento para o /bin/bash binário. Isso não faz sentido para um script como este, então eu aconselharia contra ele (e eu aconselharia contra a configuração da permissão executável sobre ele).

Uma última coisa. A análise de argumentos via nested if / else é uma maneira desajeitada de fazer as coisas. Você pode usar uma instrução case :

case $1 in
    (proto) TESTVAR= ;;
    (set)
        HISTFILE=$2
        HISTFILESIZE=$3
        ;;
    #...etc...
    ("")
        # ... put your usage here...
        ;;
    (*)
        echo >&2 "ERROR: Option unrecognized"
        echo >&2
        echo >&2 "run . ./history.bash for help"
        ;;
esac

Fazendo o script funcionar em zsh:

  1. Substituir o uso de == por = . O operador == é um alias não padrão para o operador = , e esse é um dos casos em que ele é quebrado.
  2. Renomear HISTFILESIZE para SAVEHIST
por 19.01.2016 / 00:02