Shell脚本 - 哪个词首先按字母顺序排列?

时间:2012-01-24 00:54:38

标签: bash shell alphabetical

如何检查两个单词之间按字母顺序排列的单词? 例如在代码中

#!/bin/bash

var1="apple"
var2="bye"

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

我希望它能打印苹果,因为苹果按字母顺序排在前面,但它并没有按预期工作。我做错了什么?

3 个答案:

答案 0 :(得分:9)

解决当前问题需要做的是颠倒你的陈述,因为“小于”运算符是<而不是>

这样做会让它正常工作:

if [ $var1 \< $var2 ]

或者,您可以使用要求转义的[[变体:

if [[ $var1 < $var2 ]]

我更喜欢后者,因为:

  1. 它看起来更好;和
  2. [[变体更具表现力和强大力量。

答案 1 :(得分:4)

您需要使用[[ ]]构造并打印出

#!/bin/bash

var1="apple"
var2="bye"

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

答案 2 :(得分:1)

您似乎遇到了两个关于(bash)shell脚本的误解。

首先,行if [ $var1 > $var2 ] then echo ...在语法上是错误的,您应该粘贴示例命令或代码,而不是尝试从内存中重新键入它们。如果您说if [[ "$var1" > "$var2" ]]; then ...if [ "$var" \> "$var2" ]; then ...,那就没问题了。

请注意,[[是特定于bash的条件表达式,而[(单括号)引入了/usr/bin/[/usr/bin/test的别名)命令的shell内置实现。

旧的[test)命令比bash中的[[支持具有更多约束功能。它仅支持-lt-eq ...和其他整数比较以及各种文件和值长度(-z' and - n ) and other tests. It has no support for lexical/string or pattern (regex nor glob) comparisons. The bash { {1}} [built-in for [[`扩展但是,如图所示,其中一些必须从遗留解析中明确地转义。

另请注意,使用引号supports a number of the(vs $var和引号)对其进行解除引用会很危险。如果分配给"$var"的值具有任何嵌入空格或可能与切换到var命令混合的各种其他运算符。

您还需要test;命令与if子句分开。

尝试编写shell脚本就像shell是一种普通的编程语言一样,会引起你很多这种混乱。诸如then之类的shell具有相对较少的语法和内置功能,其中大部分都是运行命令的粘合剂。在早期版本的UNIX中,shell没有任何内置测试,完全依赖于外部bash命令。随着时间的推移,越来越多的功能内置在shell中,通常通过别名来处理那些旧命令(test / usr / bin / test /usr/bin/[' is literally a link to the [command and the shell built-ins for test`是一个内部别名另一个并且实现为(主要是?)与旧的(现存的)外部二进制文件兼容。

类似地,早期Bourne shell中的所有算术运算都是使用and等外部命令完成的。 Korn shell和Bash添加了$((...))和/usr/bin/expr以及let表达式 用于在没有外部命令支持的情况下从shell中评估算术表达式。

其他示例涉及对数组(((...)))和参数扩展declare的支持 各种其他形式。

通常最好避免使用大多数此类功能,或者谨慎使用它们作为生成的脚本,因为在使用它们时逐渐减少可移植性......并且语法诡计迅速压倒代码。在某些时候,最好使用Perl,Python,Ruby或一些通用编程/脚本语言来执行常规编程工作,并将shell用于它所设计的目的......作为外部命令的粘合剂,用于编组数据和进出这些外部命令/进程的变量。