Empecé a aprender Bash hace un par de días.
Estoy tratando de obtener un estado de salida de grep
expresión en una variable como esta:
check=grep -ci 'text' file.sh
y 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
-ci
con los argumentostext
yfile.sh
, y establecer la variablecheck
al valorgrep
en 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
check
variable:o puede omitir el uso de una variable separada y tener que inspeccionar
$?
todos juntos:(tenga en cuenta
-q
que indicagrep
que 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
check
almacene el estado de salida delgrep
comando. 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=grep
en el entorno que pasa al comandopero
ci
no 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
$check
deberí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