私はこの問題に初めて触れたので、誰でもこの問題を助けることができます。すべてのコードを書きましたが、./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
ファイル名ではなくホスト名を使用しようとしています。