bash - programacion - sentencias de control en shell script
Cómo usar una variable de entorno dentro de una cadena entre comillas en Bash (5)
He intentado varias formas de lo siguiente en un script de bash:
#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Pero no puedo obtener la sintaxis para expandir correctamente la variable de entorno COLUMNS
.
He probado varias formas de las siguientes:
svn diff $@ --diff-cmd /usr/bin/diff -x ''-y -w -p -W $COLUMNS''
y
svn diff $@ --diff-cmd /usr/bin/diff -x ''-y -w -p -W ${COLUMNS}''
y
eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Sugerencias?
La siguiente secuencia de comandos funciona para mí con varios valores de $COLUMNS
. Me pregunto si no está configurando COLUMNS
antes de esta llamada.
#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
¿Puede hacer eco de $COLUMNS
dentro de su script para ver si está configurado correctamente?
Lo estás haciendo bien, así que supongo que hay algo más en la culpa (¿no es exportar COLUMNAS?).
Un truco para depurar estos casos es hacer un comando especializado (un cierre para los chicos del lenguaje de programación). Cree un script de shell llamado diff-column haciendo:
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"
y solo usa
svn diff "$@" --diff-cmd diff-columns
De esta manera, su código es más limpio de leer y más modular (enfoque de arriba hacia abajo), y puede probar el código de las columnas de diferencia de manera separada (enfoque de abajo hacia arriba).
Si no está seguro, puede usar la solicitud de ''cols'' en el terminal y olvidar COLUMNAS:
COLS=$(tput cols)
Solo una breve nota / resumen para todos los que vinieron aquí a través de Google en busca de la respuesta a la pregunta general formulada en el título (como estaba). Cualquiera de los siguientes debería funcionar para obtener acceso a las variables de shell dentro de las citas:
echo "$VARIABLE"
echo "${VARIABLE}"
El uso de comillas simples es el problema principal. Según el manual de referencia de Bash :
La inclusión de caracteres entre comillas simples (
''
) conserva el valor literal de cada carácter dentro de las comillas. Una comilla simple puede no aparecer entre comillas simples, incluso cuando está precedida por una barra invertida. [...] Los caracteres entre comillas dobles ("
) conservan el valor literal de todos los caracteres dentro de las comillas, con la excepción de$
,`
,/
y, cuando la expansión del historial está habilitada,!
. Los caracteres$
y `retienen su significado especial dentro de comillas dobles (vea Expansiones de Shell). La barra invertida retiene su significado especial solo cuando está seguida por uno de los siguientes caracteres:$
,`
,"
,/
o nueva línea. En las comillas dobles, se eliminan las barras invertidas seguidas por uno de estos caracteres. Las barras invertidas que preceden a los caracteres sin un significado especial se dejan sin modificar. Una comilla doble se puede citar entre comillas dobles precediéndola con una barra invertida. Si está habilitado, la expansión del historial se realizará a menos que aparezca un!
apareciendo entre comillas dobles se escapa mediante una barra invertida. La barra invertida que precede a la!
no se elimina. Los parámetros especiales*
y@
tienen un significado especial cuando están entre comillas dobles (vea Expansión de parámetros de shell).
En el caso específico planteado en la pregunta, $ COLUMNAS es una variable especial que tiene propiedades no estándar (consulte la respuesta de lhunath más arriba).
Tenga en cuenta que COLUMNS
es:
- NO una variable de entorno. Es un parámetro bash ordinario que es establecido por bash mismo.
- Se configura automáticamente al recibir una señal
SIGWINCH
.
El segundo punto generalmente significa que su variable COLUMNS
solo se configurará en su shell interactivo , no en un script de bash.
Si la stdin
su script está conectada a su terminal, puede buscar manualmente el ancho de su terminal preguntando a su terminal:
tput cols
Y para usar esto en tu comando SVN:
svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"
(Nota: debe citar "$@"
y mantenerse alejado de eval
;-))