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 cat
s (o echo
s) 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 cat
arriba, las variables como $1
será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 cat
correos 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 $bar
valor 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 myfile
as $1
y luego podrá hacerlo cat
según echo
sea 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 /test
está 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.