Shell guión genera un error que no se encuentra cuando se ejecuta desde un archivo sh. Pero si se ingresa manualmente, los comandos funcionan

19

Estoy tratando de usar el siguiente script para generar un mapa del sitio para mi sitio web. Cuando lo ejecuto, sh thsitemap.shaparece un error como este y crea un archivo sitemap.xml vacío:

thsitemap.sh: 22: thsitemap.sh: [[: not found
thsitemap.sh: 42: thsitemap.sh: [[: not found
thsitemap.sh: 50: thsitemap.sh: Syntax error: "(" unexpected

Pero como el mismo usuario rootcuando copio y pego manualmente estas líneas en el terminal, funciona sin ningún error y el archivo sitemap.xml tiene todas las URL. ¿Cuál es el problema? ¿Cómo puedo arreglar esto?

#!/bin/bash
##############################################
# modified version of original http://media-glass.es/ghost-sitemaps/
# for ghost.centminmod.com
# http://ghost.centminmod.com/ghost-sitemap-generator/
##############################################
url="techhamlet.com"
webroot='/home/leafh8kfns/techhamlet.com'
path="${webroot}/sitemap.xml"
user='leafh8kfns'       # web server user
group='leafh8kfns'      # web server group

debug='n' # disable debug mode with debug='n'
##############################################
date=`date +'%FT%k:%M:%S+00:00'`
freq="daily"
prio="0.5"
reject='.rss, .gif, .png, .jpg, .css, .js, .txt, .ico, .eot, .woff, .ttf, .svg, .txt'
##############################################
# create sitemap.xml file if it doesn't exist and give it same permissions
# as nginx server user/group
if [[ ! -f "$path" ]]; then
    touch $path
    chown ${user}:${group} $path
fi

# check for robots.txt defined Sitemap directive
# if doesn't exist add one
# https://support.google.com/webmasters/answer/183669
if [ -f "${webroot}/robots.txt" ]; then
SITEMAPCHECK=$(grep 'Sitemap:' ${webroot}/robots.txt)
    if [ -z "$SITEMAPCHECK" ]; then
    echo "Sitemap: http://${url}/sitemap.xml" >> ${webroot}/robots.txt
    fi
fi
##############################################
echo "" > $path

# grab list of site urls
list=`wget -r --delete-after $url --reject=${reject} 2>&1 |grep "\-\-"  |grep http | grep -v 'normalize\.css' | awk '{ print $3 }'`

if [[ "$debug" = [yY] ]]; then
    echo "------------------------------------------------------"
    echo "Following list of urls will be submitted to Google"
    echo $list
    echo "------------------------------------------------------"
fi

# put list into an array
array=($list)

echo "------------------------------------------------------"
echo ${#array[@]} "pages detected for $url" 
echo "------------------------------------------------------"

# formatted properly according to
# https://support.google.com/webmasters/answer/35738
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<urlset xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9 
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">" > $path

echo ' 
   ' >> $path;
   for ((i=0;i<${#array[*]};i++)); do
echo "<url>
    <loc>${array[$i]:0}</loc>
    <lastmod>$date</lastmod>
    <changefreq>$freq</changefreq>
    <priority>$prio</priority>
</url>" >> $path
   done
echo "" >> $path
echo "</urlset>" >> $path

# notify Google
# URL encode urls as per https://support.google.com/webmasters/answer/183669
if [[ "$debug" = [nN] ]]; then
    wget  -q --delete-after http://www.google.com/webmasters/tools/ping?sitemap=http%3A%2F%2F${url}%2Fsitemap.xml

    rm -rf ${url}
else
    echo "wget  -q --delete-after http://www.google.com/webmasters/tools/ping?sitemap=http%3A%2F%2F${url}%2Fsitemap.xml"

    echo "rm -rf ${url}"
fi
echo "------------------------------------------------------"

exit 0
THpubs
fuente
¿Cómo ejecutas el script?
cuonglm
@Gnouc sh script.sh
THpubs
8
Proveedores: bash script.sh, llamando a shhacer bashpasar al modo de POSIX. Me acuerdo de este tipo de pregunta ha sido contestada. Puede consultar esto: unix.stackexchange.com/questions/44836/…
cuonglm

Respuestas:

34

Ejecutar el script, ya sea como:

bash script.sh

o solo:

./script.sh

Cuando bashse ejecuta con el nombre sh, deshabilita la mayoría de sus extensiones, como el [[operador de prueba.

Como tiene la #!/bin/bashlínea shebang, no necesita especificar explícitamente el intérprete de shell en la línea de comando. Ejecutar el script como un comando usará esa línea para encontrar el shell.

Barmar
fuente
-1

Tanto sus ... if [[ debug = "...“ ]] ; then...comandos son incorrectos que deberían leer ...

if [ "debug" = "Y" -o "debug" = "y" ]
ruibarbo
fuente
66
No, el código es válido bash, simplemente no es válido sh.
Glenn Jackman
Error 1, línea 22 algún problema con [[.
ruibarbo
@rhubarbdog Si tiene #! / bin / sh, entonces su respuesta puede funcionar, si el archivo tiene #! / bin / bash, el if [[debug = "..."]] no debería ser un problema
Rajesh Hatwar