配列変数を関数に渡し、「コマンドが見つかりません」エラーを解決する方法

配列変数を関数に渡し、「コマンドが見つかりません」エラーを解決する方法

私はこの問題に初めて触れたので、誰でもこの問題を助けることができます。すべてのコードを書きましたが、./work.sh host.txtここを使用してシェルでこのコマンドを実行すると、ホストは2つの値を読み取るテキストファイルです。そのうちの1つは、ローカルホストと他のホストbr414b-01.csc.tntech.edu出力にテキストファイルの行を表示する必要がありますが表示されます。

cat: localhost: No such file or directory
cat: br414b-01.csc.tntech.edu: no such file or directory.

次の行にlocalhostを表示したいですbr414b-01.csc.tntech.edu。すべてのコードを追加しました。もう一つ教えてください。この行の意味と呼び出し関数で配列のグローバル変数をどのように渡すかを教えてください。

この関数を呼び出すには、スクリプトは次のコードを実行するだけです。

read_hosts $@ 

$ @はスクリプト引数(ホストを含​​むファイル名)を関数に渡します。上記のアルゴリズムでは、ホスト_配列はグローバル変数であるため、関数呼び出し元はグローバル変数を使用してホスト名にアクセスできます。

#!/bin/bash

#function name

read_hosts(){

    #function body
    hosts=$(cat $1)
    count=1
    for host in $hosts; do   
    #make an array equal to the hosts.txt file data.
    hosts_array[$count]=$host
    count=`expr $count + 1`     
    done    


    done=0      
while [ $done == 0 ]; do 

        echo "(P)ing a host"
        echo "(S)sh to host"
        echo "(T)race toute to host"
        echo "(N)slookup host"
    echo "(Q)uit"

        read -p "Please enter a command: " cmd

          case $cmd in

          P|p)  
         pick_host "$hosts"
         echo "ping -c 1 ${hosts_array[$which_host]}"
                 ping -c 1 ${hosts_array[$which_host]}       
         ;;
      S|s)
         pick_host "$hosts"
         read -p "Username: " user
         echo "ssh $user@${hosts_array[$which_host]}"
         ssh $user@${hosts_array[$which_host]}
         ;;
          T|t)
         pick_host "$hosts"
         echo "traceroute ${hosts_array[$which_host]}"
         traceroute ${hosts_array[$which_host]}
         ;;
          N|n)
         pick_host "$hosts"
         echo "nslookup ${hosts_array[$which_host]}"
         nslookup ${hosts_array[$which_host]}
         ;;
      Q|q) 
         done=1;
         exit
         ;;
           *)
         echo "Bad choice";
         ;;
      esac
done
}


pick_host(){

        count=1
 for host in `cat $1`;
 do echo "$count)$host"
 count=`expr $count + 1`
 done

 read -p "Which host " which_host
 while [ $which_host -ge 1 -a $which_host -lt $count ]; do
 echo "valid"
 done

}


read_hosts $@

答え1

pick_hostといいます"$hosts"。つまり、ファイルの内容ですhost.txt。しかし、関数では次のように言います。

for host in `cat $1`

ただし、$1最初のパラメータpick_hostは "$hosts"です。catファイル名ではなくホスト名を使用しようとしています。

関連情報