您如何检查两个单词之间的字母顺序是哪个单词?例如在代码中
#!/bin/bash
var1="apple"
var2="bye"
if [ $var1 \> $var2 ]
then
echo $var1
else
echo $var2
fi
我希望它打印苹果,因为苹果按字母顺序出现在再见之前,但它没有按预期工作。我究竟做错了什么?
您如何检查两个单词之间的字母顺序是哪个单词?例如在代码中
#!/bin/bash
var1="apple"
var2="bye"
if [ $var1 \> $var2 ]
then
echo $var1
else
echo $var2
fi
我希望它打印苹果,因为苹果按字母顺序出现在再见之前,但它没有按预期工作。我究竟做错了什么?
解决当前问题需要做的是反转陈述的含义,因为“小于”运算符是<
而不是>
。
这样做会使其正常工作:
if [ $var1 \< $var2 ]
或者,您可以使用不需要转义的变体[[
:
if [[ $var1 < $var2 ]]
我更喜欢后者,因为:
[[
变体更具表现力和功能。您将要使用该[[ ]]
构造并打印出小于另一个的构造
#!/bin/bash
var1="apple"
var2="bye"
if [[ $var1 < $var2 ]]; then
echo $var1
else
echo $var2
fi
您似乎对 (bash) shell 脚本有两个误解。
首先,该行在if [ $var1 > $var2 ] then echo ...
语法上是错误的,您应该真正粘贴示例命令或代码,而不是尝试从内存中重新键入它们。如果你说if [[ "$var1" > "$var2" ]]; then ...
或就好了if [ "$var" \> "$var2" ]; then ...
。
请注意,这是一个特定于 bash 的条件表达式,而 [(单括号)引入了(别名为)命令[[
的 shell 内置实现。/usr/bin/[
/usr/bin/test
与 bash 中的支持相比,旧的[
( test
) 命令具有更多受限制的功能。[[
它仅支持-lt
, -eq
... 和其他整数比较以及各种文件和值长度(-z' and
-n ) and other tests. It has no support for lexical/string or pattern (regex nor glob) comparisons. The
bash built-in for
[ supports a number of the
[[` 扩展,但如图所示,其中一些必须从遗留解析中显式转义。
另请注意,使用$var
(与"$var"
引号相比)的条形取消引用是危险的。如果分配给的值var
有任何嵌入的空格或各种其他运算符,这些运算符可能与test
命令的开关混为一谈。
您还需要将命令与子句;
分开。if
then
试图编写 shell 脚本,就好像 shell 是一种普通的编程语言一样,会导致你产生相当多的这种困惑。Shell,例如bash
具有相对较少的语法和内置功能,其中大部分是围绕运行命令的。在早期版本的 UNIX 中,shell 没有任何内置测试,完全依赖于外部test
命令。随着时间的推移,越来越多的功能被内置在 shell 中,通常是通过那些旧命令的别名(/usr/bin/[' is literally a link to the
/usr/bin/test command and the shell built-ins for
[ and
test` 是彼此的内部别名,并且(大部分?)实现为与旧命令兼容(并且仍然现存的)外部二进制文件。
同样,早期 Bourne shell 中的所有算术运算都是使用外部命令完成的,例如/usr/bin/expr
. Korn shell 和 Bash 添加了 $((...)) 和let
and((...))
表达式,用于在没有外部命令支持的情况下从 shell 内评估算术表达式。
其他示例涉及对数组 ( ) 和
各种其他形式的declare
参数扩展的支持。${var#...}
It's generally best to avoid most such features, or use them sparingly, as the resulting scripts because progressively less portable as you use them ... and the syntactic machinations rapidly overwhelm the code. At some point it's best to use Perl, Python, Ruby or some general purpose programming/scripting language for performing the general programming work and use shell for the purposes to which it was designed ... as glue around external commands, for marshaling data and variables into and out of those external commands/processes.