Domanda

Sto cercando di confrontare due stringhe in un semplice script di shell. Stavo usando /bin/sh invece di /bin/bash, e dopo innumerevoli ore di debugging, si scopre sh (che è in realtà trattino), non in grado di gestire questo blocco di codice:

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

Che cosa è un modo portabile per confrontare le stringhe utilizzando /bin/sh? So che posso sempre fare il contrario utilizzando! =, Ma mi chiedo su un pulitore, modo portabile.

È stato utile?

Soluzione

dash è una shell POSIX molto severo, se lavorare in dash è quasi certo che avrebbe funzionato in altre shell POSIX.

Prova:

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

Altri suggerimenti

Perché c'è anche una possibilità che lo script verrà eseguito dalla shell "sbagliato"? Vorrei pensare che si potrebbe fare un pre-requisito del vostro prodotto utilizzando la linea sh-bang di serie nella parte superiore dello script:

#!/bin/bash

Anche se un utente utilizza una shell diversa, gli altri gusci sono generalmente ancora lì e, se non, semplicemente lamentano e lo stato che sono un pre-req.

Esattamente allo stesso modo che un livello di kernel specifico, o l'esistenza di awk, può essere un pre-req.

Per la vostra domanda specifica, credo sia sh e bash permettono al singolo '=' da utilizzare per i confronti di stringhe - che è il comportamento POSIX:

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

yes

Usa = invece di ==. Confronti sono gestite da test (1). /usr/bin/[ è tipicamente un collegamento a /usr/bin/test. L'unica differenza è che se si utilizza [ in uno script di shell, il ] è richiesto pure.

Si noti che bash ha un test built-in [ / /usr/bin/test, in modo che non viene effettivamente utilizzato.

Le risposte già postato sono certamente corretto, ma può valere la pena di notare che di tanto in tanto il parametro di espansione può servire allo stesso scopo con forse qualche ulteriore flessibilità.

% 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, quindi quanto sopra non è super-utile come è, ma considerano anche che è possibile utilizzare i metodi simili per le variabili di test nel qui-documenti, in linea assegnazioni di variabili, se necessario (ad un grado ...) , o anche solo come una più breve (e più veloce!) significa di scrivere il vostro primo comunicato.

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

O anche ...

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

Forse anche ...

% 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
%

è possibile utilizzare awk

awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top