Pregunta

Estoy tratando de comparar dos cadenas en un simple script de shell. Yo estaba usando /bin/sh en lugar de /bin/bash, y después de muchas horas de depuración, resulta que sh (que es en realidad un guión) no puede manejar este bloque de código:

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

¿Qué es una manera portátil para comparar cadenas utilizando /bin/sh? Sé que siempre puedo hacer lo contrario mediante el uso de! =, Pero estoy preguntando acerca de un producto de limpieza, manera portátil.

¿Fue útil?

Solución

dash es una muy estricta shell POSIX, si funciona en dash es casi seguro que funcionaría en otra shell POSIX.

Probar:

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

Otros consejos

¿Por qué hay incluso una posibilidad de que su guión estará a cargo de la concha "malo"? Me gustaría pensar que podría hacer que un requisito previo de su producto mediante el uso de la línea SH-bang estándar en la parte superior de la secuencia de comandos:

#!/bin/bash

Incluso si un usuario utiliza un shell diferente, las otras cáscaras son generalmente sigue ahí y, si no, simplemente se quejan y afirman que son un pre-requisito.

Exactamente de la misma manera que un nivel de kernel específica, o la existencia de awk, puede ser un pre-req.

Para su pregunta específica, creo que tanto sh y bash permiten el single '=' para ser utilizado para la comparación de cadenas - que es un comportamiento POSIX:

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

yes

Uso = en lugar de ==. Las comparaciones son manejados por prueba (1). /usr/bin/[ es típicamente un enlace a /usr/bin/test. La única diferencia es que si se utiliza [ en un script de shell, se requiere que el ] también.

Tenga en cuenta que fiesta tiene un test incorporado [ / /usr/bin/test, por lo que no utiliza realmente.

Las respuestas ya publicados son ciertamente correcto, pero puede valer la pena señalar que la expansión de vez en cuando parámetro puede servir al mismo propósito con quizás algo más de flexibilidad.

% 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, así que lo anterior no es súper útil como es, sino también en cuenta que puede utilizar los métodos similares para las variables de prueba en los documentos internos, en línea asignaciones de variables si es necesario (en un grado ...) , o incluso sólo como una más corta (y más rápido!) los medios de escribir su primera declaración.

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

O incluso ...

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

Es posible que incluso ...

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

se puede usar awk

awk 'BEGIN{
 string1="test"
 string2="tes1t"
 if(s1==s2){
    print "same string"
 }else{
    print "not same"
 }
}'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top