Problemas con la variable bash que se expande con comillas simples

Problemas con la variable bash que se expande con comillas simples

Tengo una variable que construyo así:

ATTSTR=""
for file in $LOCALDIR/*.pdf
do
  ATTSTR="${ATTSTR} -a \"${file}\""
done

La variable ahora contiene (observe los espacios en blanco en el nombre del archivo):

ATTSTR=' -a "/tmp/Testpage - PDFCreator.pdf"'

Y ahora quiero usar esta variable en un comando como este:

mutt -s "Subject" "${ATTSTR}" [email protected]

Pero resulta que se expande así y, por lo tanto, el comando falla (observe las comillas simples agregadas que rodean la variable expandida):

mutt -s "Subject" ' -a "/tmp/Testpage - PDFCreator.pdf"' [email protected]

Quiero que mi variable se expanda sin comillas simples, usando "$ATTSTR"o $ATTSTRsimplemente es peor. Cómo puedo conseguir esto ?

Respuesta1

Los nombres de archivos son notoriamente poco confiables en cadenas expandidas; resistir esta tentación.

En su lugar, utilice unformaciónpara mantener los nombres de archivos intactos, independientemente de cualquier espacio en blanco:

arr=()
for f in $somedir/*.pdf
do
arr+=( -a "$f")
done

# and for usage/display:

mutt -s mysubject "${a[@]}" some@body

Ver elGuía de Bash sobre matricespara referencia.

Respuesta2

Usar la función de evaluación

command="mutt -s \"Subject\" $ATTSTR [email protected]"
response=$(eval "$command")

información relacionada