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

就我个人而言,我认为反复询问“重新连接?”的整个想法是一种令人厌恶的行为,充其量只是毫无意义地复制 shell 的命令历史记录,而且更糟糕。说真的,如果你想再跑一次,只跑ssh root@remotehost tail -f /var/log/dp.log然后击球有多难?Up-ArrowEnter或者,如果您甚至不想键入整个命令,则只需编写几个 shell 函数或小脚本(请参阅下面的示例)。

也就是说,这是一种更好的方法来完成您想要做的事情:

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

这是一种更好的方法。

将 ~/bin 添加到您的 $PATH 中,然后创建以下脚本(不要忘记使用 使它们可执行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

根据需要运行它们。使用 shell 的命令历史记录可以根据需要多次运行它们。

myssh.sh两者均可用于在远程主机上获取 root 登录 shell(如其他两个脚本所示)以 root 身份在远程主机上运行任何任意命令。

答案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,但告诉用户,您正在检查尾巴和猫。

相关内容