다음 명령을 사용하면 웹페이지에 특정 콘텐츠가 있는지 확인할 수 있습니다. 뭔가를 찾지 않으면 아무 것도 출력하지 않습니다.
curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'
문제는 이것을 쉘 스크립트에 추가하면 출력이 더 이상 억제되지 않는다는 것입니다.
#!/bin/bash
TEST1="curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'"
$TEST1
if [[ $? != 0 ]]; then
#do something if exit status of last command not equal to zero
fi
VAL1
스크립트의 출력 을 변수(
#!/bin/bash
TEST1="curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content'"
VAL1+=$($TEST1)
echo "result should be blank or the found grep $VAL1"
2>&1
명령을 직접 실행하면 예상대로 작동하지만 스크립트에 추가하면 출력이 명령줄에 직접 표시되는 이유 는 무엇 입니까?
고쳐 쓰다
의견에 있는 Jeffs의 힌트를 통해 올바른 방향으로 나아갈 수 있었습니다. 허용되는 답변이 정확합니다. 내가 스크립트를 위해 수행한 작업은 원래 변수에 할당하려고 했던 코드를 함수로 이동하여 $( ... )
모든 것이 예상대로 작동하는 것입니다.
#!/bin/bash
# note that -z checks if variable is empty
test1() {
VAL1=$(curl -v --silent https://somedomain.com/somepage.html 2>&1 | grep 'some content')
if [[ -z $VAL1 ]]; then
VAL1=test1fail
fi
}
test1
echo $VAL1
답변1
Jeff Schaller의 댓글협회코에 있어요. Bash 매뉴얼의 주요 정보(https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion)
간단한 명령을 실행할 때 셸은 왼쪽에서 오른쪽으로 다음과 같은 확장, 할당 및 리디렉션을 수행합니다.
1단계 리디렉션을 식별하고 저장합니다.
2단계에서는 변수 확장이 발생합니다.
셸에는 1단계의 리디렉션이 표시되지 않습니다.
답변2
나쁜 해결책은 이중 평가를 강제하는 것입니다.
eval "$TEST1"
좋은 해결책은 의미론적으로 명령(url, content)을 분할하는 것입니다.
curl -v --silent "$url" |& grep "$content"
참고: |&
구문상의 설탕입니다.2>&1 |