$1 의 첫문자가 '!' 이면 '!'을 떼내고,
간접참조해서 원래의 문자열을 얻어오고,
얻어온 문자열과 "no" 라는 문자열을 놓고 $op 에 정의된 연산을 해서 결과를 돌려줍니다.
x 라는 prefix 를 사용하는 이유는... (C 의 NULL 참조와 비슷한) 스크립트 문법 오류를 피할 목적입니다.
예를 들기 위해 풀어쓴 코드에서는 굳이 이렇게 할 필요가 없지만
원문대로하려면 필요합니다. eval 과 test 가 겹쳐있어서 그렇습니다.
(op 를 제외하고) 지역변수를 정의해서 써먹지 않고 저렇게 보기 힘들게 코딩하는 것은
지역변수와 전역변수가 겹쳐서 간접참조 때 오동작하는 것을 피하기 위해서 입니다.
위에 설명을 위해 풀어쓴 코드를 실제로 사용한다면 arg 나 tmp 의 값을 disable() 함수로 알아내긴 힘들겠죠.
첫줄. ${1#!} 은
첫줄.
${1#!} 은 패턴매칭입니다.
$1 의 시작부분에 !가 있다면 !를 삭제합니다.
그러므로
test "${1#!}" = "$1"
는 $1 문자열이 !로 시작하는지 하지 않는지를 검사하는 코드입니다.
&& $op== 는 앞에서 행한 연산 결과가 참이면 op 변수에 "=" 을 집어넣고,
|| $op=!= 는 앞에서 행한 연산 결과가 거짓이면 op 변수에 "!=" 을 집어넣습니다.
따라서 첫줄의 뜻은
$1 의 첫 문자가 '!' 이면 op 에 "=" 을 대입하고, 그 밖의 경우엔 op 에 "!=" 을 대입
두번째 줄.
세가지가 섞여 있는데... 설명을 위해 풀면
$1 의 첫문자가 '!' 이면 '!'을 떼내고,
간접참조해서 원래의 문자열을 얻어오고,
얻어온 문자열과 "no" 라는 문자열을 놓고 $op 에 정의된 연산을 해서 결과를 돌려줍니다.
x 라는 prefix 를 사용하는 이유는... (C 의 NULL 참조와 비슷한) 스크립트 문법 오류를 피할 목적입니다.
예를 들기 위해 풀어쓴 코드에서는 굳이 이렇게 할 필요가 없지만
원문대로하려면 필요합니다. eval 과 test 가 겹쳐있어서 그렇습니다.
(op 를 제외하고) 지역변수를 정의해서 써먹지 않고 저렇게 보기 힘들게 코딩하는 것은
지역변수와 전역변수가 겹쳐서 간접참조 때 오동작하는 것을 피하기 위해서 입니다.
위에 설명을 위해 풀어쓴 코드를 실제로 사용한다면 arg 나 tmp 의 값을 disable() 함수로 알아내긴 힘들겠죠.
OTL
설명 감사합니다....
휴~ 설명을 들어도 어렵네요...
말보다는 코드가 더
말보다는 코드가 더 쉽죠
OTL
헛~
감사합니다... 친절한 설명까지.... ㅎㅎ
댓글 달기