strings not equal bash dash string-comparison

not - comparación de bash, dash y string



bash if (5)

¿Por qué existe la posibilidad de que su script sea ejecutado por el shell "incorrecto"? Creo que podría hacer de eso un requisito previo de su producto utilizando la línea estándar sh-bang en la parte superior de su script:

#!/bin/bash

Incluso si un usuario usa un shell diferente, los otros shells generalmente siguen ahí y, si no, simplemente se quejan y afirman que son un requisito previo.

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

Para su pregunta específica, creo que sh y bash permiten que se use el único ''='' para las comparaciones de cadenas, es decir, el comportamiento de POSIX:

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

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

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

¿Qué es una forma portátil de comparar cadenas usando /bin/sh ? Sé que siempre puedo hacer lo contrario usando! =, Pero me pregunto por una forma más limpia y portátil.


Las respuestas ya publicadas son ciertamente correctas, pero puede valer la pena tener en cuenta que, en ocasiones, la expansión de parámetros puede servir para el mismo propósito, quizás con cierta flexibilidad adicional.

% 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, entonces lo anterior no es tan útil como es, pero considera que puedes usar métodos similares para probar variables en documentos aquí, asignaciones de variables en línea si es necesario (hasta cierto punto ...), o incluso así como un medio más corto (y más rápido) de escribir su primera declaración.

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

O incluso...

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

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


Use = lugar de == . Las comparaciones son manejadas por prueba (1). /usr/bin/[ normalmente es un enlace a /usr/bin/test . La única diferencia es que si usa [ en un script de shell, el ] es obligatorio.

Tenga en cuenta que bash tiene una test integrada / [ , por lo que en realidad no usa /usr/bin/test .


puedes usar awk

awk ''BEGIN{ string1="test" string2="tes1t" if(s1==s2){ print "same string" }else{ print "not same" } }''


dash es un shell POSIX muy estricto, si funciona en dash es casi seguro que funcionaría en otro shell POSIX.

Tratar:

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