저는 이 문제에 대해 처음 접했기 때문에 누구든지 이 문제에 대해 도움을 줄 수 있습니다. 모든 코드를 작성했지만 ./work.sh host.txt
여기를 사용하여 셸에서 이 명령을 실행할 때 호스트는 두 개의 값을 읽을 텍스트 파일입니다. 그 중 하나는 로컬 호스트 및 다른 호스트 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
파일 이름이 아닌 호스트 이름을 사용하려고 합니다 .