2016-06-08 4 views
4

최근 클라이언트의 ksh 스크립트에서 변수를 지정하는 데 에코가 비정상적으로 사용되었습니다.누군가 echo를 사용하여 bash 또는 ksh에서 변수에 값을 할당하는 이유는 무엇입니까?

는 예를 들어, 누군가가 이런 짓을했을 수 있습니다 어떤 이유에 올 수 없었습니다 다음

a='something' 
b='else' 
c=`echo "${a} ${b}"` 

으로 많은 경우가 있습니다.

여기에는 몇 가지 기존 이유가있을 수 있습니까? (30 년 이상 셸을 사용해 본 적이 없으며 이전에는 본 적이 없었습니다.)

아니면 그냥 무지한가요? C는 다음과 같이 선언 될 수 있기 때문에 당신이 본 것은

+3

쉘 스크립팅의 작동 방식에 대해 잘 모르는 사람이 있습니까? 아마. – iHowell

+0

아마 유산인가요? 그들은 이전에 backticks를 사용하는 데 의미가있는 다른 것을 한 다음 변경했을 때 최소한의 변경을 가능하게 만들었습니까? – Flexo

+0

흥미 롭습니다. 나는 printf에 대한 여러 가지 이유를 생각해 낼 수 있지만, 내 머리 꼭대기에 에코는 없다. – andlrc

답변

0

에코의 잘못된 사용의 예는 다음과 같습니다

c="$a $b" 

당신은 출력을 필터링 할 때 명령을 필요로 할 때 에코의 일반적인 용도는, 예를 들면,

$ line="100090 $100,00 Mary" 
$ name=`echo "$line" | grep -Eo "[a-zA-Z]+$"` 
echo $name 
Mary 

에코를 전혀 사용하지 않으면 더 효율적입니다. 위의 새로운 프로세스를 생성하지 않고, "읽기"와 함께 할 수 같은 일 :

$ line="100090 $100,00 Paul" 
$ read -r _ _ name _ <<<"$line" 
echo $name 
Paul 
+1

이것은 실제로 좋은 예가 아닙니다 :'$ line'의 내용을 문자열로 분할하고 glob-expand합니다. 따라서'*'를 포함하는 컬럼이 있다면, 파일 이름의리스트로 대체 될 것이다. 열 사이에 탭이 있으면 공간이됩니다. –

+0

또한 bash에 외부 도구를 실행하는 것보다 행의 세 번째 행을 제공하도록 bash에게 요청하는 것이 더 효율적입니다. 'awk'는 하나의 awk 프로세스를 사용하여 한 줄 단위로 처리하는 것이 아니라 전체 문자열을 처리하는 경우에 유용합니다. –

+0

$ name은 세 번째 줄이 아닌 문자열의 세 번째 줄입니다 –

3

현재 bash는, 또는 POSIX의 sh 또는 Bourne의 전임자에 하나, 무엇이든지 이것에 대한 더 강력한 이유가 없습니다.

c="$a $b" 

는 ... 주어진 코드에 대한 완전한 대체하고, 루프에 넣어 시도 (훨씬 빠르게 실행되며, 역 따옴표에 의해 만들어진으로, 명령 대체를 서브 프로세스로 새로운 쉘을 포크 읽기의 stdout - 높은 오버 헤드 작업).

+0

의견에 감사드립니다. 나는이 스크립트들을 정리하고있다. 불필요한 에코가 제거되고 백틱이 $()로 변환됩니다. 또한 '쓸모없는 고양이 사용'도 제거합니다.이 또한 풍부합니다. –