Frage

Ich versuche, zwei Saiten in einem einfachen Shell -Skript zu vergleichen. Ich habe benutzt /bin/sh Anstatt von /bin/bash, Und nach unzähligen Stunden des Debuggens stellt sich heraus, dass SH (der tatsächlich Dash ist) diesen Codeblock nicht verarbeiten kann:

if [ "$var" == "string" ]
then
    do something
fi

Was ist ein tragbarer Weg, um Zeichenfolgen mithilfe von Strings zu vergleichen? /bin/sh? Ich weiß, dass ich immer das Gegenteil mithilfe! = Tun kann, aber ich frage mich über einen saubereren, tragbaren Weg.

War es hilfreich?

Lösung

dash ist eine sehr strenge POSIX -Hülle, wenn sie funktioniert dash Es ist fast sicher, dass es in anderen Possix -Shell funktionieren würde.

Versuchen:

if [ "$var" = "string" ]
then
    some_command
fi

Andere Tipps

Warum gibt es sogar eine Möglichkeit, dass Ihr Skript von der "falschen" Shell ausgeführt wird? Ich würde denken, Sie könnten dies zu einer Voraussetzung Ihres Produkts machen, indem Sie die Standard-SH-Bang-Linie oben in Ihrem Skript verwenden:

#!/bin/bash

Auch wenn ein Benutzer Verwendet Eine andere Hülle, die anderen Muscheln sind im Allgemeinen immer noch da und beschweren sich einfach und geben Sie einfach an, dass sie ein Voraussatz sind.

Genau wie eine bestimmte Kernelebene oder die Existenz von awk ist ein Vorreq.

Für Ihre spezifische Frage glaube ich beides sh und bash Lassen Sie die einzelne '=' für String -Vergleiche verwendet werden - das ist posix -Verhalten:

if [ "a" = "a" ] ; then
    echo yes
fi

yes

Verwenden = Anstatt von ==. Vergleiche werden mit Test (1) behandelt. /usr/bin/[ ist normalerweise ein Link zu /usr/bin/test . Der einzige Unterschied besteht darin, dass wenn Sie verwenden [ in einem Shell -Skript die ] ist ebenfalls erforderlich.

Beachten Sie, dass Bash ein integriertes Integration hat test/[, so dass es nicht wirklich verwendet /usr/bin/test.

Die bereits veröffentlichten Antworten sind sicherlich korrekt, aber es kann sich lohnen, zu beachten, dass gelegentlich die Parametererweiterung mit möglicherweise zusätzlicher Flexibilität den gleichen Zweck erfüllen kann.

% p() { printf 'notvar = %b\n' "${notvar##"${string1}"}${string2}" ; }
% string1='some stuff about things\c'
% string2='some different stuff maybe'
% notvar="$string1" p
> 'some different stuff maybe'
% notvar="$string2" p
> 'some stuff about things'

OK, das oben genannte ist so wie es ist nicht übernützig, aber auch bedenken, dass Sie die ähnlichen Methoden zum Testen von Variablen in den hier-dokumenten, bei Bedarf (bis zu einem gewissen Grad ...) oder sogar in line Genau wie ein kürzeres (und schneller!) Mittel zum Schreiben Ihrer ersten Aussage.

[ ! "${var##"string"}" ] && _MATCH || _NOMATCH

Oder auch...

[ ${#var#*"${s=string}"} -lt ${#var} ] && _SUB_STRING_TEST=TRUE

Möglicherweise sogar ...

% p() { printf '%s is %s of %s' "$2" "${var_chk-not}" "$1"
> }<<HEREDOC
> ${in="${1##*"${2}"*}"}
> ${in:-
>     ${in="${1##"${2}"}"}
>     ${in:-${var_chk=all}
>     ${var_chk=some}
> }
> HEREDOC
%

Sie können awk verwenden

awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top