2012-01-24 2 views
4

두 단어 사이에 어떤 단어가 알파벳 순으로 먼저 표시되는지 어떻게 확인할 수 있습니까? 코드쉘 스크립팅 - 어떤 단어가 영문자 순으로 첫 번째입니까?

#!/bin/bash 

var1="apple" 
var2="bye" 

if [ $var1 \> $var2 ] 
then 
echo $var1 
else 
echo $var2 
fi 

사과 순 안녕 앞에 오는 이후, 그것은 사과를 인쇄하려면,하지만 의도 한대로 작동 밤은 예를 들어 . 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

7

당신이 즉시 문제를 해결하기 위해 수행해야하는 명세서의 감각을 역입니다 왜냐하면 "미만"연산자가 >이 아닌 <이기 때문입니다.

이렇게하면 제대로 작동을 얻을 것이다 :

if [[ $var1 < $var2 ]] 

내가 선호 :

if [ $var1 \< $var2 ] 
또는

, 당신은이 탈출을 필요로 하지 않는 [[ 변형을 사용할 수 있습니다 후자 때문에 :

  1. 더 멋지네요.
  2. [[ 변형은 훨씬 표현력이 뛰어나고 강력합니다.
+0

덜 작거나 같은 연산자가 있습니까? [[$ var1 <= $ var2]]이 (가) 작동하지 않는 것 같습니다. – Jaan

+1

@Jaan, 아니요, bash에는'<='와 같은 문자열 기반 복합 연산자가 없습니다. 반대 동작을 부정함으로써 아주 쉽게 에뮬레이트 할 수 있습니다 : 개념적 ['[[$ a <= $ b]]'은 실제'[[! $ a> $ b]]'. – paxdiablo

4

당신은 [[ ]] 구조를 사용하고보다 작은 사람을 인쇄 할 수 있습니다 다른

#!/bin/bash 

var1="apple" 
var2="bye" 

if [[ $var1 < $var2 ]]; then 
    echo $var1 
else 
    echo $var2 
fi 
+0

고마워요! 저는 보통 C++로 프로그램을합니다. 그래서 나는 알파벳순으로 오는 단어가 이후에 오는 것보다 큽니다. – user1161080

+1

@ user1161080 : C++에서 어설 션이있는 부분을 자세히 설명합니까? :-) – paxdiablo

1

(bash) 셸 스크립팅에 대한 두 가지 오해가있는 것으로 보입니다.

처음에 라인 if [ $var1 > $var2 ] then echo ...은 구문 상 틀 렸습니다. 실제로 메모리에서 다시 입력하지 말고 예제 명령이나 코드를 붙여야합니다. if [[ "$var1" > "$var2" ]]; then ... 또는 if [ "$var" \> "$var2" ]; then ...이라고 말하면 괜찮습니다.

[(단일 브래킷)은 /usr/bin/[ (별칭은 /usr/bin/test) 명령의 쉘 내장 구현을 소개하는 반면 [[은 bash 특정 조건식입니다.

이전 [ (test) 명령에는 bash에서 [[ 지원보다 훨씬 제한적인 기능이 있습니다. 그것은 단지 -lt, -eq ... 그리고 다른 정수 비교와 다양한 파일과 가치 길이를 지원 그들 중 일부가 될 필요가 같이 배쉬 built-in for가 [supports a number of the [[`확장하지만, 명시 적으로 기존의 탈출 (-z' and -n ) and other tests. It has no support for lexical/string or pattern (regex nor glob) comparisons. The 구문 분석.

는 또한 (따옴표와 "$var" 대) $var의 바 역 참조를 사용하는 것이 위험 해 있습니다. var에 할당 된 값이 어떤 공백 또는 test 명령에 스위치으로 융합 할 수있는 다양한 사업자가있는 경우 .

또한 then 절에서 if 명령을 분리하려면 ;이 필요합니다.

셸이 일반적인 프로그래밍 언어 인 것처럼 셸 스크립트를 작성하려고하면 이런 종류의 혼동이 생길 수 있습니다. bash과 같은 쉘은 구문 및 내장 기능이 상대적으로 적으며 대부분 명령 실행과 관련하여 접착제가 사용됩니다. 초기 버전의 UNIX에서는 셸에 내장 테스트가없고 외부의 test 명령에 전적으로 의존했습니다. 시간이 지남에 따라 쉘에 내장 된 기능이 점점 더 많아졌습니다. 오래된 명령어의 별명을 통해 종종 ("/usr/bin/[' is literally a link to the/usr/bin/test command and the shell built-ins for [and test`는 서로에 대한 내부 별명이며 오래된 (아직도 현존하는) 외부 바이너리.

마찬가지로 모든 산술 연산을 초기의 Bourne 셸은. 같은 /usr/bin/expr 같은 외부 명령을 사용하여 수행 Korn 쉘 및 배쉬를 위해 $ ((...))와 let((...)) 표현 을 추가했다 외부 명령 지원없이 쉘 내에서 산술 표현식을 평가.

다른 예제는 배열 (declare) 및 매개 변수 확장 ${var#...} 다양한 다른 형식.

일반적으로 이러한 기능을 사용하지 않는 경우 점차적으로 이식성이 떨어지기 때문에 이러한 기능을 대부분 피하거나 사용하지 않는 것이 좋으며 ... 구문 방식이 급격하게 코드를 압도합니다. 어느 시점에서 Perl, Python, Ruby 또는 일반적인 프로그래밍 작업을 수행하고 셸을 디자인 목적으로 사용하는 데 필요한 범용 프로그래밍/스크립팅 언어를 사용하는 것이 가장 좋습니다. 외부 명령 주위에 접착제로, 데이터를 마샬링하고 외부 명령/프로세스의 변수들.