¿Quieres mejorar esta pregunta? Actualice la pregunta para que esté relacionada con el tema de Unix y Linux Stack Exchange.
Cerrado hace 5 años.
Mejorar esta pregunta
Estoy escribiendo un script bash basado en un menú, una de las opciones del menú es enviar un correo electrónico con un archivo de texto adjunto. Tengo problemas para verificar si mi archivo es un archivo de texto. Esto es lo que tengo:
fileExists=10
until [ $fileExists -eq 9 ]
do
echo "Please enter the name of the file you want to attach: "
read attachment
isFile=$(file $attachment | cut -d -f2)
if [[ $isFile = "ASCII" ]]
then
fileExists=0
else
echo "$attachment is not a text file, please use a different file"
fi
done
Sigo recibiendo el corte de error:el delimitador debe ser un solo carácter.
Respuesta aceptada:
El problema ocurre en cut -d -f2
. Cámbielo a cut -d -f2
.
Para cut
, los argumentos se ven así:
# bash: args(){ for i; do printf '%q \n' "$i"; done; }
# args cut -d -f2
cut
-d -f2
Y aquí esta el problema. Escapó el espacio a un espacio literal en lugar de un delimitador entre argumentos en su shell, y no agregó un espacio adicional, por lo que todo
-d -f2
parte aparece como un argumento. Debes agregar un espacio adicional para que -d
y -f2
aparecen como dos argumentos.
Para evitar confusiones, muchas personas usan comillas como -d' '
en su lugar.
P.D.:En lugar de usar archivos y hacer que todo sea ASCII, prefiero usar
if file "$attachment2" | grep -q text$; then
# is text
else
# file doesn't think it's text
fi