Bash 如何将变量重定向到文本文件中,然后按字母顺序排序

Bash 如何将变量重定向到文本文件中,然后按字母顺序排序,bash,alphabetical,Bash,Alphabetical,我的脚本要求每次输入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 numbe

我的脚本要求每次输入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
Inputs: B
Inputs: A
Inputs: C
Inputs: 0
The total number of valid input letters:
3

The first valid input:
A
问题:它应该导致A。 任何帮助都将不胜感激。

此行:

echo $n | sort > out.txt
始终仅使用最新输入来清除文件
out.txt
。也许你应该使用:

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

echo $n | sort -o out.txt out.txt -
cp
命令创建一个空文件。
sort
命令读取现有文件
out.txt
及其标准输入(新行),对结果进行排序并将其写入
out.txt

对于短输入,这是正常的;如果它需要扩展到数千行,那么它的效率不是很高

此外,在Bash中,不需要使用
expr
进行算术运算:

((count++))

使用以下代码

#! /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:
C
Inputs: B
Inputs: A
Inputs: C
Inputs: 0
The total number of valid input letters:
3

The first valid input:
A

因为您只需要最小的(字母顺序)有效输入,所以不需要排序。这里有一个替代答案,不使用排序,只保留最小的有效输入:

#!/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
#/垃圾箱/垃圾箱
计数=0
直到[[$n=~0]];做
回波输入:
阅读
如果[[$n=~^[A-Z]$];然后
((count++)
如果[-z$first]|[expr$n\<$first`-eq 1];然后
第一名=$n
fi
fi
完成
回显有效输入字母的总数:
echo$count
回声“”
回显第一个有效输入:
echo$first