간단한 Bash 스크립트에서 "예기치 않은 토큰 '$#'' 근처 구문 오류"가 발생합니다.

간단한 Bash 스크립트에서 "예기치 않은 토큰 '$#'' 근처 구문 오류"가 발생합니다.

나는 그것을 사용하고 있다데비안 10(Buster) 간단한 Bash 스크립트에서 오류가 발생했습니다. 그것이 하는 일은 인수가 전달되었는지 확인하는 것뿐입니다. 파일인 경우 해당 파일을 에코하면 됩니다.

#!/usr/bin/bash
if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then
        echo "$1"
fi

exit 1

다음 오류가 발생합니다.

line 2: syntax error near unexpected token `'$#''
line 2: `if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then'

나는 주변 따옴표(", ', 따옴표 없음)의 모든 조합을 시도했지만 $#항상 내가 사용하는 따옴표 유형에 따라 이러한 오류 메시지의 변형이 나타납니다. 무엇을 찾고 있는지 알 수 없습니다.

답변1

여기에는 두 가지 문제가 있습니다. 첫째, 간단한 [내장 함수는 포함될 수 없습니다 &&. 여러 조건을 결합하려면 다음 중 하나 이상이 필요합니다 [.

if [ "$#" -eq 1 ] && [ -f "$1" ]; then

$#둘째, 확장해야 하기 때문에 작은따옴표를 사용할 수 없습니다 . 귀하의 버전은 '$#' -eq 1다음과 함께 작동합니다. $#1위로.

bash 키워드를 사용하면 모든 것이 훨씬 간단해집니다 [[.

if [[  "$#" -eq 1  &&  -f "$1"  ]]; then

답변2

[명령이므로 실제로 문제는 여러 조건을 사용하려는 방식입니다. 당신은 이것을 원합니다 :

if [ "$#" -eq 1 ] && [ -f "$1" ]; then

답변3

다른 답변에서는 스크립트 수정 방법을 설명하지만 기술적으로 오류가 무엇인지 알고 싶습니다. 명령의 단어를 인용 해제하고 이스케이프하지 않도록 허용하는 bash의 유일한 유효한 구문은 (함수를 정의할 때라고 생각합니다. 그래서 bash는 그것을 보고 (즉시 그것이 이라는 함수의 정의임에 틀림없다고 생각합니다 . 그러나 당신은 단지 을 기대하는 bash를 [따르기 때문에 구문 오류가 발생합니다. 함수 정의가 아니라면 그 의미가 무엇인지 누가 알겠습니까? 그 이후에는 동일한 구문 오류가 발생합니다.'$#')()

$ echo ( foo )
bash: syntax error near unexpected token `foo'

다음에 나오는 내용을 제거 (하고 함수 정의 구문을 따르지 않으면 다음과 같은 결과가 나타납니다.

$ [ ( ) ( -f "$1" )

마지막으로 함수가 정의됩니다 [.

$ [
bash: -f: command not found

관련 정보