Empecé a aprender Bash hace un par de días.
Estoy tratando de obtener un estado de salida de grepexpresión en una variable como esta:
check=grep -ci 'text' file.shy la salida que obtuve es
No command '-ic' found¿Debo hacerlo con un comando de tubería?
                    
                        bash
                                shell
                                command-line
                                grep
                                exit-status
                                
                    
                    
                        omri gilhar
fuente
                
                fuente

$?justo después de que finalice el comando.Respuestas:
Su comando,
será interpretado por el shell como "ejecutar el comando
-cicon los argumentostextyfile.sh, y establecer la variablecheckal valorgrepen su entorno".El shell almacena el valor de salida del comando ejecutado más recientemente en la variable
?. Puede asignar su valor a una de sus propias variables como esta:Si desea actuar sobre este valor, puede usar su
checkvariable:o puede omitir el uso de una variable separada y tener que inspeccionar
$?todos juntos:(tenga en cuenta
-qque indicagrepque no envíe nada y que salga tan pronto como algo coincida; no estamos realmente interesados en qué coincide aquí)O, si solo quiere "hacer cosas" cuando no se encuentra el patrón :
Guardar
$?en otra variable solo es necesario si necesita usarlo más tarde, cuando el valor en$?se ha sobrescrito, como enEn el fragmento de código anterior,
$?se sobrescribirá el resultado de la[ "$err" -ne 0 ] && [ ! -d "$dir" ]prueba. Guardarlo aquí solo es realmente necesario si necesitamos mostrarlo y usarlo conexit.fuente
Su pregunta no está clara, pero según el código que ha enviado, parece que desea que la variable
checkalmacene el estado de salida delgrepcomando. La forma de hacerlo es correrCuando se ejecuta un comando desde un shell, su estado de salida se pone a disposición a través del parámetro especial concha,
$?.POSIX (el estándar para sistemas operativos similares a Unix) documenta esto en su especificación para el shell y la implementación de Bash se documenta en Parámetros especiales .
Como eres un nuevo alumno, te recomiendo que comiences con un buen libro y / o un tutorial en línea para obtener los conceptos básicos. No se recomiendan las recomendaciones de recursos externos en los sitios de Stack Exchange, pero sugeriría Lhunath y la Guía Bash de GreyCat .
fuente
Le ha dicho a bash que establezca la variable
check=grepen el entorno que pasa al comandopero
cino existeCreo que pretendía encerrar ese comando en marcas de retroceso, o entre paréntesis precedidos por un signo de dólar, cualquiera de los cuales asignaría el recuento de cuántas líneas se encontró 'texto' (sin distinción de mayúsculas y minúsculas) en el archivo:
Ahora
$checkdebería ser 0 si no hay coincidencias, o positivo si hubo coincidencias.fuente
¿Confundido por qué usar -c al verificar la salida? Se usa para verificar cuántas veces se empareja algo, no si tiene éxito o no.
pero en este ejemplo
No genera nada excepto un código de salida, que luego se repite. Este es el resultado que utiliza la verificación de variables. También lo prefiero porque es una sola línea.
Puede reemplazar --silent con -q. Lo uso ya que no estás interesado en la salida grep, solo si funcionó o no.
fuente
La forma correcta de asignar la salida del comando grep a una variable es como se menciona en @ monty-harder:
Aunque para asignar el estado de salida de este comando a una variable, debe usar el parámetro de shell
$?justo después de ejecutar el comando como se muestra a continuación:fuente