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