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 목록 없음) 실패합니다. 이런 일이 발생하기를 원하는지 확실하지 않습니다.