如何检查两个单词之间按字母顺序排列的单词? 例如在代码中
#!/bin/bash
var1="apple"
var2="bye"
if [ $var1 \> $var2 ]
then
echo $var1
else
echo $var2
fi
我希望它能打印苹果,因为苹果按字母顺序排在前面,但它并没有按预期工作。我做错了什么?
答案 0 :(得分:9)
解决当前问题需要做的是颠倒你的陈述,因为“小于”运算符是<
而不是>
。
这样做会让它正常工作:
if [ $var1 \< $var2 ]
或者,您可以使用不要求转义的[[
变体:
if [[ $var1 < $var2 ]]
我更喜欢后者,因为:
[[
变体更具表现力和强大力量。答案 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用于它所设计的目的......作为外部命令的粘合剂,用于编组数据和进出这些外部命令/进程的变量。