쉘 스크립트에서 두 개의 명령으로 두 개의 매개변수 세트를 전달하는 방법은 무엇입니까?

쉘 스크립트에서 두 개의 명령으로 두 개의 매개변수 세트를 전달하는 방법은 무엇입니까?

bash 스크립트의 명령줄 인수를 변경하지 않고 명령으로 전달해야 하는 경우 스크립트는 다음과 같습니다.

args=("$@")
mycommand "${args[@]}"

Bash 스크립트의 명령줄 인수를 두 그룹, 즉 두 명령으로 분할해야 한다면,

$ myscript -s "-o pid,tname,time,ucmd" -g "-d, -u t -t pts/4"

이것은myscript

while getopts ":s:g:" opt; do                                                                                                                                                 
    case $opt in                                                                                 
        s) 
            argss="$OPTARG"
            ;;
        g) 
            argsg="$OPTARG"
            ;;
    esac
done

ps -p $(pgrep $argsg) $argss

따라서 스크립트 호출은 사실상 다음과 동일합니다.

$ ps -p $(pgrep -d, -u t -t pts/4) -o pid,tname,time,ucmd

$argsg스크립트는 매개변수 에 공백이 있고 매개변수를 완전히 분리한다는 가정에 의존하기 때문에 매개변수 확장 주위에 큰따옴표가 없습니다 $argss . 많은 사람들이 이미 알고 있듯이 이 가정은 때때로 성립하지 않을 수도 있습니다. 인수에는 공백이 포함될 수 있습니다. 인수를 전달할 명령이 하나만 있는 경우 배열을 사용합니다(이 문서의 시작 부분). 그렇다면 이 두 명령을 함께 묶는 더 좋은 방법이 있습니까?

그런데, 허용하기 ps위해 마무리하려고 합니다 .pgrep프로세스 선택을 위한 AND 조건. 이와 같은 스크립트를 작성할 필요는 없을 것 같지만(너무 단순화하지는 않는 것 같습니다) 기억나지 않을 때를 대비하여 이 스크립트를 저장할 수 있으며 다른 상황이 있을 수 있습니다. 더 나은 아이디어가 없을 때 더 필요한 것 같습니다.

감사해요.

답변1

통과모든 사람명령줄에서 매개변수를 별도의 인수로 처리하고 옵션 처리 루프를 활용하여 각 매개변수에 어떤 배열을 추가해야 하는지 결정합니다.

 #!/bin/bash
 for opt; do
    if     [[ $opt == -s ]]; then sel=s; continue; fi
    if     [[ $opt == -g ]]; then sel=g; continue; fi

    if     [[ $sel == s  ]]; then argss+=("$opt");
    elif   [[ $sel == g  ]]; then argsg+=("$opt");
    else
           echo "There is an error with the value of val=$val"
           exit 3
    fi
 done

 echo pgrep "${argsg[@]}"
      pgrep "${argsg[@]}"

 echo ps "${argss[@]}"
      ps "${argss[@]}" -p "$(pgrep "${argsg[@]}")"

명령줄에서 각 프로그램에 대해 독립적으로 옵션을 작성합니다.

다음과 같이 실행하세요:

myscript -s -o pid,tname,time,ucmd -g -d, -u t -t pts/4

방금 몇 가지 기본 조건을 테스트했으므로 더 자세히 테스트해야 합니다. pgrep의 출력이 원래 명령과 같이 비어 있으면(프로세스 IP 목록 없음) 실패합니다. 이런 일이 발생하기를 원하는지 확실하지 않습니다.

관련 정보