배열 변수를 함수에 전달하고 "명령을 찾을 수 없음" 오류를 해결하는 방법

배열 변수를 함수에 전달하고 "명령을 찾을 수 없음" 오류를 해결하는 방법

저는 이 문제에 대해 처음 접했기 때문에 누구든지 이 문제에 대해 도움을 줄 수 있습니다. 모든 코드를 작성했지만 ./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파일 이름이 아닌 호스트 이름을 사용하려고 합니다 .

관련 정보