Siguiendo con su pregunta anterior , parece que quiere tanto texto no interpretado como texto interpretado en un archivo. En ese caso, use 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í hay un par de cosas: en primer lugar, la sintaxis heredoc con <<
. Si incluye comillas en esa cadena de terminación, como en la primera de arriba, el heredoc completo no se interpreta, sin parámetros ni sustituciones. Si no usa comillas, como en el segundo cat
anterior, las variables como $1
serán reemplazadas por sus valores y las sustituciones de comandos se incluirán en el texto. Usted elige entre citar la cadena "EOF" o no en función de si desea sustituciones o no.
Para poner ambos correos cat
electrónicos en el mismo archivo, estamos usando la >>
redirección para la segunda (y más adelante) redirecciones: eso significa agregar al archivo. Para el primero, usamos un sencillo >
para borrar el archivo y comenzar de nuevo.
Tenga en cuenta que, incluso cuando las variables se sustituyen , cualquier signo de dólar adicional en el valor de esa variable no se sustituye nuevamente:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
dará salida:
$bar
sin sustituir en $bar
el valor de.
Sin embargo, si proporciona un "$" en el argumento de todo este script, debe escapar de él en la línea de comando o encerrarlo todo entre comillas simples. Alternativamente, la sustitución de comandos como en su otra pregunta le permite colocar el contenido de un archivo completo directamente, incluidos los signos 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 can cat
o entonces echo
según sea necesario. Se aplican las mismas limitaciones que en mi respuesta : hay un límite para la duración de los argumentos de la línea de comandos, y si su archivo puede ser más largo que eso, debe encontrar otro enfoque. Puede averiguar cuál es el límite en su sistema congetconf ARG_MAX
$1
) contiene signos de dólar'. No si se refiere al primer parámetro de línea de comando. La sustitución se realizó antes de que se ejecutara el script. Tienes que escapar de él en la línea de comando.