5

アルファベット順で 2 つの単語の最初にある単語を確認するにはどうすればよいですか? たとえば、コードで

#!/bin/bash

var1="apple"
var2="bye"

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

アップルはアルファベット順でさようならの前に来るので、アップルを印刷したいのですが、意図したとおりに機能していません。私は何を間違っていますか?

4

3 に答える 3

10

差し迫った問題を解決するために必要なことは、ステートメントの意味を逆にすることです。これは、「より小さい」演算子がでは<なくであるため>です。

そうすることで、正しく機能するようになります。

if [ $var1 \< $var2 ]

または、エスケープを必要としない[[バリアントを使用することもできます。

if [[ $var1 < $var2 ]]

私は後者を好みます:

  1. 見栄えがします。と
  2. [[バリアントははるかに表現力豊かで強力です。
于 2012-01-24T01:12:22.453 に答える
4

[[ ]]コンストラクトを使用して、他のものよりも小さいものを出力する必要があります

#!/bin/bash

var1="apple"
var2="bye"

if [[ $var1 < $var2 ]]; then
  echo $var1
else
  echo $var2
fi
于 2012-01-24T00:57:26.903 に答える
2

(bash) シェル スクリプトに関する 2 つの誤解に悩まされているようです。

まず、この行if [ $var1 > $var2 ] then echo ...は構文的に間違っているため、例のコマンドやコードをメモリから再入力するのではなく、実際に貼り付ける必要があります。if [[ "$var1" > "$var2" ]]; then ...とか、とか言ってくれればいいのにif [ "$var" \> "$var2" ]; then ...

[[は bash 固有の条件式であり、[ (一重括弧) は/usr/bin/[(エイリアスの/usr/bin/test) コマンドのシェル組み込み実装を導入することに注意してください。

古い[( ) コマンドには、bashtestでのサポートよりもはるかに制限された機能があります。、... およびその他の整数比較と、さまざまなファイルと値の長さ ( -n bash [ [[` 拡張機能)[[のみをサポートしますが、示されているように、それらの一部はレガシー解析から明示的にエスケープする必要があります。-lt-eq-z' and) and other tests. It has no support for lexical/string or pattern (regex nor glob) comparisons. Thebuilt-in forsupports a number of the

$varまた、バーの逆参照(vs "$var"with the quotes)を使用するのは危険であることに注意してください。に割り当てられた値に、コマンドvarへのスイッチと混同される可能性のある埋め込みスペースまたはさまざまな他の演算子がある場合。test

また、コマンドを句から;分離する必要があります。ifthen

シェルが通常のプログラミング言語であるかのようにシェル スクリプトを記述しようとすると、この種の混乱がかなり発生します。などのシェルには、bash構文と組み込み機能が比較的少なく、そのほとんどはコマンドの実行に関する接着剤です。testUNIX の初期のバージョンでは、シェルには組み込みのテストがなく、完全に外部コマンドに依存していました。時が経つにつれて、より多くの機能がシェルに組み込まれ、多くの場合、古いコマンドのエイリアス ( /usr/bin/[' is literally a link to the/usr/bin/test command and the shell built-ins for[ andtest` は相互の内部エイリアスであり、(ほとんど?) 古いコマンドと互換性があるように実装されています (そして今でも)現存) 外部バイナリ。

同様に、初期の Bourne シェルでのすべての算術演算は、 などの外部コマンドを使用して行われまし/usr/bin/exprた。Korn シェルと Bashは、外部コマンドのサポートなしでシェル内から算術式を評価するための$((...)) and letand式を追加しました。((...))

他の例は、配列 ( ) のサポートと、 さまざまな他の形式のdeclareパラメーター展開に関連しています。${var#...}

一般的には、そのような機能のほとんどを避けるか、控えめに使用することをお勧めします。これは、スクリプトを使用すると移植性が次第に低下するためです...そして、構文の機械化がコードを急速に圧倒します。ある時点で、Perl、Python、Ruby、または一般的なプログラミング作業を実行するための汎用プログラミング/スクリプト言語を使用し、設計された目的のためにシェルを使用するのが最善です...外部コマンドをマーシャリングするための接着剤としてこれらの外部コマンド/プロセスに出入りする変数。

于 2012-01-24T01:36:14.500 に答える