방금 쉘을 배웠고 vscode와 쉘 체크를 사용하여 systax를 확인합니다. 내가 하고 있는 일의 예는 다음과 같습니다. 특정 텍스트 파일에 문자열이 있는지 확인하고 싶습니다.
#!/usr/bin/bash
Echo "Enter user"
if [ $grep -q binhqq "text.txt"] ; then
echo "Found"
fi
그런데 왜 이런 경고가 표시되는지 경고해 주셨네요. Don't wrap commands in []/[[]])
정말 감사합니다.
답변1
스크립트에는 몇 가지 기본적인 문제가 있습니다.
Echo
당신은 대신 사용echo
$grep
대신 사용합니다grep
.$
변수를 역참조하기 위해 여기서는 필요하지 않습니다.사용자에게 말하지만
Enter user
실제로 입력 내용을 읽지는 않습니다.
쉘 점검 경고:
SC1072: Expected test to end here (don't wrap commands in []/[[]]). Fix any mentioned problems and try again.
grep -q binhqq "text.txt"
내부가 유효한 EXPR이 아니고 test
( 참조 help test
) 다음을 사용하여 수정할 수 있기 때문에 발생합니다.명령 대체:
if [ -n "$(grep binhqq text.txt)" ] ; then
(출력이 grep
비어 있지 않은지 테스트) 또는 [
및 완전히 제거하십시오 ]
.
if grep -q binhqq "text.txt" ; then
(종료 상태에 따라 다름 grep
)
답변2
구문에 주의하세요 if
(bash에는 매우 유용한 대화형 help
시스템이 있습니다)
$ help if
if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
Execute commands based on conditional.
The `if COMMANDS' list is executed. If its exit status is zero, then the ...
키워드를 본 후 bash는 명령을 볼 것으로 예상합니다. 특별한 것은 없습니다 if
. 단지 내장된 명령이나 키워드일 뿐입니다. 여기에는 어떤 명령 목록/파이프라인도 넣을 수 있습니다.[
[[
((
마법은 if
가지가 다음을 기반으로 한다는 것입니다.종료 상태명령 수: 종료 상태가 다음과 같은 경우영그런 다음 "실제" 분기를 선택합니다.0이 아닌종료 상태로 인해 "false" 분기가 발생합니다.
답변3
[
명령 test
(또는 동일한 기능을 가진 내장 명령)의 별칭입니다.
따라서 이 작업을 수행할 때 명령을 호출 [ grep …
하고 전달합니다 . 그런 다음 "당신이 말한 내용을 이해할 수 없습니다 ." 라고 말하십시오.test grep ….
test
grep …
test
grep …