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つのスクリプトに示すように)リモートホストから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" ])
>

2番目の問題は、まず確認することです。丸太そしてcatを使用しますが、ユーザーに確認していることを伝えます。そして猫。

関連情報