Bash-, Dash- und String -Vergleich
-
11-09-2019 - |
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.
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"
}
}'