Shell Script: создание переменной с параметрами внутри

ssh -Q key

Если у вас нет древней версии OpenSSH, и в этом случае ухххх, погрузитесь в исходный код или запустите ssh -v -v -v ... и посмотрите, появится ли там то, что вы хотите.

10
24.02.2018, 18:47
2 ответа

Nunca se recomienda poner un comando complejo en una variable. Ver BashFAQ/050 -Estoy tratando de poner un comando en una variable, ¡pero los casos complejos siempre fallan!

Su requisito se vuelve realmente simple, si simplemente decide usar una función en lugar de una variable y pasarle argumentos.

Algo así como

rsync_custom() {
    [ "$#" -eq 0 ] && { printf 'no arguments supplied' >&2; exit 1 ; }
    rsync -avz --{partial,stats,delete,exclude=".*"} "$@"
}

y ahora pásele los argumentos requeridos como

rsync_custom /dir1 /dir2

La definición de la función es bastante simple en cierto modo, primero verificamos el recuento de argumentos de entrada usando la variable $#que no debería ser cero. Lanzamos un mensaje de error que dice que no se proporcionan argumentos. Si hay argumentos válidos, "$@"representa los argumentos reales proporcionados a la función.

Si esta es una función que usaría con bastante frecuencia, es decir, también en la línea de scripts/comandos -, agréguela a los archivos de inicio de shell -, .bashrc, .bash_profilepor ejemplo.

O, como se indicó, puede valer la pena expandir la expansión de llaves para separar argumentos para una mejor legibilidad como

rsync_custom() {
    [ "$#" -eq 0 ] && { printf 'no arguments supplied' >&2; exit 1 ; }
    rsync -avz --partial --stats --delete --exclude=".*" "$@"
}
13
27.01.2020, 20:00

Al menos puede guardar las opciones parcialmente en una variable:

opts=$(echo --{ignore-case,word-regexp,count,exclude="sys*.*"})

Las pruebas son importantes porque el enmascaramiento puede ser difícil:

echo $opts
--ignore-case --word-regexp --count --exclude="sys*.*"

grep $opts bytes *.log 

Dado que hay múltiples alternativas, como usar el historial, usar un alias, usar una función, no hay ningún caso de uso obvio -que se me ocurra.Rara vez hay una opción compleja para compartir entre diferentes programas, por lo que para una solución ad -hoc para el shell interactivo, el alias parece una mejor manera:

alias cgrep='grep --ignore-case --word-regexp --count --exclude="sys*"'
cgrep bytes *.log

Su muestra

VAR=rsync -avz --{partial,stats,delete,exclude=".*"}

no puede funcionar, porque la asignación finaliza en el primer espacio en blanco. Tienes que enmascarar los espacios en blanco:

VAR='rsync -avz --{partial,stats,delete,exclude=".*"}'

una cosa bastante peligrosa para la prueba, con esa --opción de eliminación, ¿no? Dado que las opciones pueden contener nuevamente "," y comillas simples, el enmascaramiento puede volverse difícil muy pronto. Buscaría un alias o confiaría en el historial.

Se puede almacenar un alias en el archivo ~/.bashrc para uso continuo en múltiples sesiones. Las funciones también se pueden almacenar en el bashrc, pero solo las necesita, si desea manejar parámetros, pasados ​​a la función para ser evaluados allí.

1
27.01.2020, 20:00

Теги

Похожие вопросы