이 코드 줄에서 Bash 셸 스크립트 script.sh 에 오류가 발생 합니다.
let initialLines=$(grep '' "$1" | wc -l || true)
오류는 다음과 같습니다. script.sh: line 146: let: initialLines=: syntax error: operand expected (error token is "=")
여기서 구문 적으로 잘못된 것은 무엇입니까?
tl; dr :
명령 대체를 큰 따옴표로 묶으십시오.
let initialLines="$(grep '' "$1" | wc -l || true)"
즉, chepner의 유용한 답변 에서 설명했듯이 RHS를 이중 인용 할 필요없이 간단한 할당 만 사용할 수 있지만 let
여기 와 동일한 결과를 얻으려면 -i
먼저 변수를 선언해야합니다 . 예 :declare -i initialLines
할당$(...)
의 RHS (명령 대체 ( )) 는 명령이 실행되기 전에 발생 하는 셸 확장 과정에서 빈 문자열 또는 공백 접두사가 붙은 문자열 로 평가 되므로 bash
결국 하나를 구문 분석하려고합니다. 다음 명령 중 :
let initialLines=
let initialLines= 2
이것을 분리하여 시도하면 경험 한 구문 오류가 발생합니다.
가장 가능성이 높은 설명은 macOS에서와 같이 BSD를 사용 wc
하고 -l
있으며 선행 공백으로 요청 된 줄 수를 출력한다는 것 입니다.
간단한 수정은이다 를 두 번 인용 명령 대체를 :
let initialLines="$(grep '' "$1" | wc -l || true)"
명령 대체의 명령과 관련하여 (예시 일 수 있지만 주석 처리 할 가치가 있습니다) :
grep ''
항상 모든 입력 라인을 반환 하므로 덜 효율적 cat
입니다.
사용에 의미가 없습니다 || true
.
명령 대체가 실행되는 서브 쉘의 종료 코드는 set -e
효과가 있더라도 관련이 없습니다 .
또한 빌트인 에 stdout 출력 이 없기 때문에 true
대체 명령 으로 사용 하면 let
명령도 중단 됩니다.true
요약하면 전체 명령 대체를 wc -l < "$1"
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다