Pasar una variable a un script bash que usa 'EOF' y considera la variable como literal

Pasar una variable a un script bash que usa 'EOF' y considera la variable como literal

en este script termino guardando "$1" en el archivo /test.

#!/bin/bash
cat > /test << 'EOF'
$1
EOF

la verdad es... necesito mantener

'EOF'

como 'EOF' porque mi argumento ($1) contiene signos de dólar.

pero necesito que se guarde ese argumento en lugar de $1

Respuesta1

Seguimiento de suPregunta anterior, suena como si quisierasambosalgo de texto no interpretado y algo de texto interpretado van a un archivo. En ese caso, utilice dos cats (o echos) diferentes:

cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF

Aquí están sucediendo un par de cosas: en primer lugar, elheredocsintaxis con <<. Si incluye comillas en esa cadena de terminación, como en la primera anterior, todo el documento heredoc no se interpreta: no hay parámetros ni sustituciones. Si ustednouse comillas, como en elsegundo catarriba, las variables como $1serán reemplazadas por sus valores y las sustituciones de comandos se incluirán en el texto. Usted elige entre comillas o no la cadena "EOF" en función de si desea sustituciones o no.

Para poner ambos catcorreos electrónicos en el mismo archivo que estamos usando>> redirecciónpara la segunda (y posteriores) redirecciones: eso significa agregar al archivo. Para el primero, usamos uno >para borrar el archivo y comenzar de nuevo.

Tenga en cuenta que, incluso cuandolas variables se sustituyen, cualquier signo de dólar adicional en el valor de esa variableno lo sonse volvieron a sustituir:

foo='$bar'
bar=hello
cat <<EOF
$foo
EOF

generará:

$bar

sin sustituir el $barvalor de .

Sin embargo, si proporciona un "$" en el argumento de todo este script, debe evitarlo en la línea de comando o encerrarlo todo entre comillas simples. Alternativamente,sustitución de comandocomo entu otra preguntale permite colocar el contenido de un archivo completo directamente, incluido cualquier signo de dólar en el contenido del archivo. Asegúrese de citar la cadena de sustitución allí:

oo.sh "$(cat myfile)"

Obtendrá el cuerpo de myfileas $1y luego podrá hacerlo catsegún echosea necesario. Las mismas limitaciones que enmi respuesta ahíaplicar: hay un límite de longitud que pueden durar los argumentos de la línea de comandos, y si su archivo puede ser más largo, debe buscar otro enfoque. Puede averiguar cuál es el límite en su sistema congetconf ARG_MAX

Respuesta2

Parece que simplemente desea enviar una variable al archivo. En ese caso, esto funcionará:

echo $1 >/test

Tenga en cuenta que /testestá en el directorio raíz, para el cual los usuarios normales normalmente no tienen permiso de escritura.

EDITAR: tenga en cuenta que debe citar la cadena que contiene el signo de dólaren la línea de comando. Ahí es donde ocurre la sustitución, y el guión no puede hacer nada al respecto después del hecho.

información relacionada