라벨이 Bash Script인 게시물 표시

Bash 스크립트 eval, quoting과 command substitution 에 대해서...

이미지
bash 스크립트를 짜다가 갑자기 eval, quoting과 command substitution에 대해 좀 명확히 해서 블로그에 올리고 싶어서 실험을 좀 하였다. 위는 weak quoting ("") 과 eval의 기본적인 특성을 보여주는 예시이다. 근데 eval을 통해 $c의 값을 온전히 출력하려면 어떻게 해야할까? eval "echo \"hello\\\";echo \\\"fool\"" 이 실행되도록 하면 된다. 그러면 결국 echo "hello\";echo \"fool"이 실행되어 hello";echo "fool 이 출력될 것이다. (물론 eval "echo \$c" 가 제일 쉬운 방법) 위는 strong quoting ('') 과 2가지 command substitution ($() 와 ``) 의 특성을 보여주는 예이다. ` `을 사용할 때 특히 주의해야할 점은 ` ` 안에 있는 ' ' 에 까지 ` `의 escaping이 적용된다는 점이다. 그리고 ` ` 의 escaping은 string quoting의 escaping 과는 다르다는 것이다. 예를들어 \"은 적용이 안된다. (오타정정 : but \s --> but \") $() 은 그안에 escaping이 never!! 절대로 적용되지 않는다.. 심지어 "$(~~"~~"~$(...)~)" 의 문법도 가능하다. 또 주의해야할 점이 "`~~`" 의 경우이다. 이 경우에는 ~~ 부분에 대해 ` `의 escaping 규칙과 " "의 escaping 규칙이 같이 적용된다. (100% 정확하진 않고... 개인적인 경험/실험에 의한 의견이다) 하지만 \\ 등에 대해서 중...

bash 와 dash의 차이점

이미지
오늘도 역시나 뻘짓을 하였다. bash script를 짜놓고 sh a.sh 같은 식으로 실행시키니 우분투에서 sh는 dash를 기본적으로 가리키므로 dash에 의해 a.sh가 실행이 되어서 예상치 못한 결과가 나왔다. 덕분에 시간을 날렸지만 아래와 같은 사실을 알 수 있었당~   bash와 dash는 공통적으로 \(역슬래쉬) 를 특수하게 사용한다. 따라서 문자자체로서의 역슬래쉬를 표현하려면 \\을 사용해야한다.  따라서 bash에서의 결과는 상식적인 결과일 것이다. dash에서도 역슬래쉬를 표현하여면 \\를 사용해야하는 건 똑같다. 하지만 dash 에서는 큰따옴표안에서 이스케이프문자를 지원한다. 무슨 말이냐면 결론적으로 echo "\\\\" 를 해야 화면에 \이 출력되는 것이다. \\이 \로 처리되고 그렇게 모인 두개의 \\가 이스케이프문자로 인식되 \ 하나가 결국 출력되는 것이다. 이 사진은 보던지 말던지~ * 그리고 `` 보다 $() 를 사용하도록 하자! bash script가 정말 리눅스환경에서 간단간단하게 뭐 만들때 정말 좋긴한데 문법이 너무 거지같은거 같다. 어쩌면 내가 체계적으로 안배우고 그때 그때 검색해서 쓰는 식으로 익혀서 그런거일수도...