다음 스크립트를 해석하는 방법은 무엇입니까?

다음 스크립트를 해석하는 방법은 무엇입니까?

암호:

#!/bin/csh

if ( A$1 == A ) then
    echo ""
    echo "LIST <name>"
    echo ""
    exit
endif

..............

좋습니다. 제가 얻은 더 큰 스크립트의 예는 다음과 같습니다. 스크립트는 이 코드로 시작하며 뒤따르는 코드와는 아무런 관련이 없습니다.

스크립트의 사용법은 다음과 같습니다: LIST 'name', 여기서 LIST스크립트 명령과 'name'사용자가 도입한 특정 상수는 다음과 같습니다.

지금까지 내가 아는 것은 다음과 같이 스크립트를 실행하면 다음과 같습니다.

LIST 'name'

스크립트는 상수를 사용하여 작업을 수행하지만 실행하지 않으면 다음을 수행합니다 'name' .'name'

LIST

다음이 표시됩니다.

LIST <name>

명령 사용 방법에 대한 간단한 설명과 같습니다. 이 설명은 if 내부의 에코에서 비롯됩니다.

내가 이해해야 할 것은 다음 줄의 기능입니다.

if ( A$1 == A ) then

감사해요!

답변1

이렇게 하면 $1빈 문자열이 아닌지 확인됩니다. $1빈 문자열인 경우 if 조건은 다음과 같습니다.

( A == A )

true로 평가됩니다. 이는 구문 오류가 없는지 확인하는 해결 방법입니다. 그냥 이렇게 하면:

if ( $1 == "" )

$1빈 문자열을 사용 하면 이 표현식 ( == "" )으로 인해 구문 오류가 발생합니다.

적어도 bsd-csh, tcsh, 에서는 ( $1 == "" )작동합니다. 원본의 경우 다음 csh을 사용해야 합니다.

if ( "A$1" == "A" )

변수는 항상 큰따옴표로 묶어야 합니다. 설명을 참조하세요.여기. 에서는 csh변수에 $a개행 문자가 포함되어 있으면 작동하지 "$a"않습니다 $a:q.

답변2

이 줄은 $1비어 있는지 확인합니다. $1사용자가 명령줄에서 스크립트를 실행할 때 스크립트에 전달되는 첫 번째 매개변수입니다. 비어 있으면 $1문자에 아무것도 추가되지 않으므로 Atrue A == A가 됩니다.

답변3

if저는 루프가 매개변수가 스크립트에 전달되는지 테스트하는 방법이라고 생각합니다 . 기술적으로 이것은 루프의 목적이지만 if, nullity 를 확인하는 데 사용된다고 말하는 것이 더 적절하다고 생각합니다 $1. 예를 들어 스크립트를 복사하여 다음과 같이 호출했습니다.

script "some_argument"

if예상대로 루프 에 들어가지 않습니다 . 이제 매개변수 없이 호출하면

script

내가 얻는 결과는,LIST <name>

따라서 echo스크립트에 전달된 매개변수를 확인하기 위해 if 루프 앞에 문을 추가했습니다. 따라서 매개변수 없이 스크립트를 호출하면 if루프 내부로 들어갑니다.

또한 A$1 == A$1이 비어 있는지 테스트해 보세요. 그런 것이 있고 somethingvalid$1 == somethingvalid스크립트를 로 호출 하더라도 script여전히 if루프에 들어가 출력을 인쇄합니다.

답변4

Gnouc은 중요한 점을 지적하지만 이를 강조하지는 않습니다. 쉘 변수(예: ) 또는 위치 매개변수(예: )를 인용할 때마다 인용하지 않을 충분한 이유가 없는 한 큰따옴표(예: )로 묶어야 합니다. 이렇게 하세요 당신은 당신이 무엇을 하고 있는지 확실히 알고 있습니다. 특수 문자(예: , 또는 )가 없는 상수 문자열은 따옴표로 묶을 필요가 없지만 그렇게 해도 문제가 없습니다. 예를 들어, 따옴표 붙은 문자열은 연결되고 결합될 수 있습니다.$identifier$futur$digit$1"$1"Afoobar"foo""bar""foobar"A"$1""A""$1""A$1"

  • 따옴표는 빈 문자열의 존재를 유지합니다. Gnouc이 설명했듯이 스크립트에 다음과 같은 내용이 있으면

    if ( $1 == "" )
    

    매개변수 없이 호출하면

    LIST
    

    또는 명시적인 빈 문자열 매개변수를 사용하세요.

    LIST ""
    

    그러면 if명령문은 다음과 같이 "확장"됩니다.

    if ( == "" )
    

    이로 인해 구문 오류가 발생합니다.

  • 따옴표는 공백이나 특수 문자가 포함된 문자열의 무결성을 유지합니다. 공백이 포함된 인수를 사용하여 스크립트를 호출하면

    LIST "foo bar"
    

    그러면 if명령문 ( if ( A$1 == A ))은 다음과 같이 확장됩니다.

    if ( Afoo bar == A )
    

    이로 인해 구문 오류가 발생합니다. 인용된 와일드카드가 포함된 인수를 사용하여 스크립트를 호출하면 비슷한 결과가 발생합니다.

    LIST "foo*"
    

하지만 왜 스크립트가 다음과 같이 말하지 않는지 아무도 설명하지 않습니다.

if ( "$1" == "" )

이전 버전에서는 csh다음을 사용하여 스크립트를 호출한 경우이것토론,

LIST ==

그러면 if명령문은 다음과 같이 확장됩니다.

if ( "==" == "" )

이로 인해 구문 오류도 발생했습니다. 사람들은 인수(피연산자)가 다음과 같이 보이지 않도록 하기 위해 또는 if와 같은 명령문을 작성할 때 위치 인수(및 적절한 경우 쉘 변수/환경 변수)를 보호합니다.A$1"A$1"운영자 (특히 /, +및 ) 파서 -*혼란스러워집니다. 이 문제는 수정된 것 같습니다(적어도 csh일부 버전에서는 / tcsh). 방금 내 (Cygwin) 버전에서 이것을 시도했습니다 tcsh.

$ if ( == == "" ) 에코 예
if: 표현식 구문.
$ if ( == == == ) echo 는
if: 표현식 구문.
$ if ( "==" == "" ) 에코 예
                                <---(출력 없음)
$ if ( "==" == "==" ) 에코 예
$ if ( / == / ) 에코는
0으로 나눕니다.
$ if ( "/" == "/" ) echo 예

그래서,

  • 따옴표는 매개변수가 연산자가 아닌 if피연산자임을 명령에 알려줍니다.tcsh

관련 정보