bash 스크립트 확인 매개변수

bash 스크립트 확인 매개변수

호스트에 로그인하고 지시에 따라 명령을 실행하려는 bash 스크립트에 다음이 있습니다.

#!/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

2달러를 제공하지 않으면 여전히 불평하는 것으로 나타났습니다. line 4: [: too many arguments왜 그럴까요?

답변1

개인적으로 "Reconnect?"를 반복적으로 묻는 전체 아이디어는 성가신 일이며 기껏해야 쉘의 명령 기록을 무의미하게 복제하는 역할을 한다고 생각합니다. 진지하게, 다시 달리고 싶다면 ssh root@remotehost tail -f /var/log/dp.log그냥 달리고 배팅하는 것이 얼마나 힘들겠습니까? Up-ArrowEnter또는 전체 명령을 입력하고 싶지 않다면 몇 가지 셸 함수나 작은 스크립트만 작성하면 됩니다(아래 예 참조).

즉, 원하는 작업을 수행하는 더 좋은 방법은 다음과 같습니다.

#!/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

이것이 더 나은 방법입니다.

chmod +x$PATH에 ~/bin을 추가하고 다음 스크립트를 생성합니다(다음을 사용하여 실행 가능하게 만드는 것을 잊지 마십시오).

~/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

필요에 따라 실행하십시오. 셸의 명령 기록을 사용하여 필요한 만큼 여러 번 실행하세요.

myssh.sh둘 다 원격 호스트에서 루트 로그인 셸을 얻는 데 사용할 수 있습니다.그리고(다른 두 스크립트에 표시된 대로) 원격 호스트에서 루트로 임의의 명령을 실행합니다.

답변2

이 두 경우와 다음 두 경우 모두에서 $2를 마스크하면 $2가 비어 있을 때 아무것도 아닌 상태가 되는 것을 방지할 수 있습니다.

#!/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

(독일어 로케일 사용):

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

비교하다:

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

두 번째 문제는 먼저 확인하는 것입니다.통나무그리고 cat을 사용하지만 사용자에게 확인 중임을 알려줍니다.꼬리그리고 고양이.

관련 정보