2014-11-18 5 views
1

제 스크립트는 한 번에 대문자를 입력하고 0으로 끝나면 유효하지 않은 입력을 표시하고 첫 번째 유효한 상위 문자를 표시해야합니다.변수를 텍스트 파일로 리디렉션 한 다음 알파벳순으로 정렬하는 방법

#! /bin/sh 
count=0 

until [[ $n =~ 0 ]]; do 
    echo Inputs: 
    read n 
    if [[ $n =~ ^[A-Z]$ ]]; then 
     count=`expr $count + 1` 
     echo $n | sort > out.txt 
    fi 
done 

echo The total number of valid input letters: 
echo $count 
echo " " 
echo The first valid input: 
head -n 1 /filepath/out.txt 

출력 :

Inputs: 
B 
Inputs: 
A 
Inputs: 
C 
Inputs: 
0 

The total number of valid input letters: 
3 

The first valid input: 
C 

질문 : 그것은 어떤 도움을 이해할 수있을 것이다 A. 발생한다.

답변

0

이 줄 :

echo $n | sort > out.txt 

은 언제나 최신의 입력과 파일 out.txt을 zaps. 어쩌면 당신은 사용해야

cp /dev/null out.txt # Before the loop 

echo $n | sort -o out.txt out.txt - 

cp 명령은 빈 파일을 만듭니다. sort 명령은 기존 파일 out.txt과 그 표준 입력 (새 행)을 읽고 결과를 정렬하여 out.txt에 써냅니다.

짧은 입력에 대해서는 정상입니다. 수천 줄로 확장해야한다면 매우 효율적이지 않습니다. 또한

, 강타, 당신은 산술 expr를 사용할 필요가 없습니다 :

((count++)) 
0

다음 코드를 사용합니다.

#! /bin/sh 
count=0 

>out.txt 
until [[ $n =~ 0 ]]; do 
    read -p 'Inputs: ' n 
    if [[ $n =~ ^[A-Z]$ ]]; then 
     count=`expr $count + 1` 
     echo $n >> out.txt 
    fi 
done 

echo The total number of valid input letters: 
echo $count 
echo " " 
echo The first valid input: 
sort out.txt |head -n 1 

출력 :

Inputs: B 
Inputs: A 
Inputs: C 
Inputs: 0 
The total number of valid input letters: 
3 

The first valid input: 
A 
0

만 작은 (알파벳 순서) 유효한 입력을 원하기 때문에, 당신은 정렬이 필요하지 않습니다. 정렬을 사용하지 않고 가장 작은 유효한 입력을 유지하는 대신 대답을 제시합니다.

#!/bin/sh 

count=0 

until [[ $n =~ 0 ]]; do 
    echo Inputs: 
    read n 
    if [[ $n =~ ^[A-Z]$ ]]; then 
     ((count++)) 
     if [ -z $first ] || [ `expr $n \< $first` -eq 1 ]; then 
      first=$n 
     fi 
    fi 
done 

echo The total number of valid input letters: 
echo $count 
echo " " 
echo The first valid input: 
echo $first