getopt 및 케이스 기능이 실행되지 않습니다.

getopt 및 케이스 기능이 실행되지 않습니다.

스크립트에 매개변수를 전달할 때 이런 문제가 발생했습니다. 케이스 메뉴에 해당하는 기능이 실행되지 않았습니다. 스크립트는 매개변수를 입력으로 받아들이고 적절한 작업을 수행합니다.

#!/bin/bash

usage () {
echo " Usage:
-h, --help         #Displaying help
-p, --proc         #Working with directory /proc
-c, --cpu          #Working with CPU
-m, --memory       #Working with memory
-d, --disks        #Working with disks
-n, --network      #Working with networks
-la, --loadaverage #Displaying the load average on the system
-k, --kill         #Sending signals to processes
-o, --output       #Saving the results of script to disk"

exit2
}

proc () {
if [ -n "$1" ]
then
      if [ -z "$2" ]
      then
             ls /proc
      else
           cat /proc/"$2"
       fi
fi
}

parsed_arguments=$(getopt -o hp:c:m:d:n:la:k:o: --long help,proc:,cpu:,memory:,disks:,network:,loadaverage:,kill:,output:)
if [[ "${#}" -eq "" ]]
then
       usage
fi
eval set -- "$parsed_arguments"
while :
do
      case "$1" in
      -h | --help) echo " Showing usage!"; usage
       ;;
       -p | --proc) proc
       ;;
     esac
done

스크립트가 인수를 받지 못하면 옵션에 대한 설명이 표시되어야 하지만, 스크립트가 "-" 또는 "--"로 시작하는 첫 번째 인수를 입력으로 받으면 다음 문자 또는 단어에 해당하는 함수가 실행되어야 합니다. "-"또는"--". 예

No parameters:
./script.sh
 Usage:
-h, --help         #Displaying help
-p, --proc         #Working with directory /proc
-c, --cpu          #Working with CPU
-m, --memory       #Working with memory
-d, --disks        #Working with disks
-n, --network      #Working with networks
-la, --loadaverage #Displaying the load average on the system
-k, --kill         #Sending signals to processes
-o, --output       #Saving the results of script to disk"

With one parameters:
./script.sh -p
or
./script.sh --proc
The contents of the /proc directory should be displayed

With additional parameters:
 ]]./script.sh -p cpuinfo
or
./script.sh --proc cpuinfo
The contents of the file passed through the additional parameter should be displayed

매개변수 없이 스크립트를 실행하지만 매개변수가 있는 스크립트는 실행하지 않습니다. 스크립트에 매개변수를 전달할 때 해당 함수가 실행되지 않는 이유가 무엇인지 알려주실 수 있나요?

답변1

getopt명령줄 매개변수는 자체 매개변수로 구문 분석되어야 합니다. 실제로 작동하는 util-linux/Busybox getopt를 사용하는 경우 올바른 구문은 --일반적으로 다음과 같이 인수를 추가한 다음 구문 분석하는 것 입니다.

getopt -o abc --long this,that -- "$@"

여기서는 "$@"스크립트 자체의 매개변수로 확장됩니다.

while그러면 매개변수를 사용하지 않고 shift항상 동일한 매개변수를 확인하기 때문에 끝없는 루프가 발생하게 됩니다 $1.

스크립트에 다른 문제가 있을 수 있지만 이러한 문제를 해결하려면 시작해야 합니다. 를 사용하여 스크립트를 실행하거나 스크립트 시작 부분에 bash -x myscript추가하여 명령을 볼 수 있습니다.set -x실제로달리다.

바라보다getopt, getopts 또는 수동 구문 분석 - 짧은 옵션과 긴 옵션을 모두 지원하려면 무엇을 사용해야 합니까?또는이 답변또는내 대답은 여기에 있다사용 방법의 예입니다 getopt.

관련 정보