bash script verificar argumentos

0

Eu tenho o seguinte em um script com o qual eu quero fazer login para hospedar e executar um comando conforme as instruções:

#!/bin/bash
echo $1;
if [ -n ${2+x} ] ; then
    if [ $2 != "log" -a $2 != "cat" ] ; then
        echo "$0 $1 : second argument must be empty, "tail" or "cat""
        exit 1
    fi
elif [ -z ${2+x} ] ; then

    ssh -o StrictHostKeyChecking=no -p 2222 root@$1; echo "Reconnect?"; while read < /dev/tty; do ssh -o StrictHostKeyChecking=no -p 2222 root@$1; echo "Reconnect?"; done

elif [ $2 == "tail" ] ; then

    ssh -o StrictHostKeyChecking=no -p 2222 root@$1 tail -f /var/log/dp.log; echo "Reconnect?"; while read < /dev/tty; do ssh -o StrictHostKeyChecking=no -p 2222 root@$1 tail -f /var/log/dp.log; echo "Reconnect?"; done

elif [ $2 == "cat" ] ; then
    ssh -o StrictHostKeyChecking=no -p 2222 root@$1 cat /var/log/dp.log; echo "Reconnect?"; while read < /dev/tty; do ssh -o StrictHostKeyChecking=no -p 2222 root@$1 cat /var/log/dp.log; echo "Reconnect?"; done

fi

e acontece que, se eu não forneço $ 2, ele ainda reclama sobre line 4: [: too many arguments porque é isso, eu estou querendo saber?

    
por cerr 21.02.2018 / 23:37

2 respostas

1

Pessoalmente, penso em toda a ideia de pedir repetidamente "Reconectar?" é uma abominação que, na melhor das hipóteses, duplica inutilmente o histórico de comandos do seu shell, mas muito, muito pior. Sério, como é difícil executar ssh root@remotehost tail -f /var/log/dp.log e, em seguida, pressionar Seta para cima Enter se você quiser executá-lo novamente? ou apenas escreva algumas funções de shell ou minúsculos scripts se você não quiser digitar o comando inteiro uma única vez (veja abaixo exemplos).

Dito isto, aqui está uma maneira melhor de fazer o que você está tentando fazer:

#!/bin/bash

error() {
  local ec msg

  ec="$1" ; shift
  msg="$*"

  [ -n "$msg" ] && echo "$msg" >&2
  [ "$ec" != 0 ] && exit "$ec"
}

[ -z "$1" ] && error 1 "first argument missing. must be hostname"
echo "$1"

myssh() {
  local remote reconnect quit

  remote="$1" ; shift
  quit=0

  while [ $quit != 1 ] ; do
    ssh -o StrictHostKeyChecking=no -p 2222 "$remote" "$@"

    read -p "Reconnect (Y/n) [Y]? " reconnect
    [[ $reconnect =~ ^[Nn] ]] && quit=1
  done
}

case "$2" in
   cat|log) myssh "root@$1" cat /var/log/dp.log ;;
      tail) myssh "root@$1" tail -f /var/log/dp.log ;;
        "") myssh "root@$1" ;;
         *) error 1 "Unknown second argument '$2'" ;;
esac

Aqui está uma maneira ainda melhor de fazer isso.

Adicione ~ / bin ao seu $ PATH e então crie os seguintes scripts (não esqueça de torná-los executáveis com chmod +x )

~ / bin / myssh.sh:

#!/bin/sh
[ -z "$1" ] && echo hostname is required && exit 1
remote="$1" ; shift
ssh -o StrictHostKeyChecking=no -p 2222 "root@$remote" "$@"

~ / bin / remote-cat.sh:

#!/bin/sh
myssh.sh "$1" cat /var/log/dp.log

~ / bin / remote-tail.sh:

#!/bin/sh
myssh.sh "$1" tail -f /var/log/dp.log

Execute esses itens conforme necessário. Use o histórico de comandos do seu shell para executá-los novamente quantas vezes quiser.

myssh.sh pode ser usado para obter um shell de login raiz no host remoto AND (conforme demonstrado pelos outros dois scripts) para executar quaisquer comandos arbitrários como root no host remoto. / p>     

por 22.02.2018 / 04:43
0

Se você mascarar $ 2 nos dois casos e nos posteriores, você evita que os $ 2 sejam nada quando estiverem vazios.

#!/bin/bash
echo $1;
if [ -n ${2+x} ] ; then
    if [ "$2" != "log" -a "$2" != "cat" ] ; then
        echo "$0 $1 : second argument must be empty, "tail" or "cat""
        exit 1
    fi

(com localidade alemã):

> echo $([ != "log" -a != "cat" ])
> bash: [: Zu viele Argumente.

compare:

> echo $([ "" != "log" -a "" != "cat" ])
>

Um segundo problema pode ser que você primeiro verifique log e cat, mas informe ao usuário que está verificando tail e cat.

    
por 21.02.2018 / 23:59