Le script shell génère une erreur introuvable lors de l'exécution à partir d'un fichier sh. Mais si elles sont entrées manuellement, les commandes fonctionnent

19

J'essaie d'utiliser le script suivant pour générer un plan du site pour mon site Web. Lorsque je l'exécute, sh thsitemap.shj'obtiens une erreur comme celle-ci et crée un fichier sitemap.xml vide:

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

Mais en tant que même utilisateur rootlorsque je copie et colle manuellement ces lignes sur le terminal, cela fonctionne sans erreur et le fichier sitemap.xml contient toutes les URL. Quel est le problème? Comment puis-je réparer cela?

#!/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
la source
Comment exécutez-vous le script?
cuonglm
@Gnouc sh script.sh
THpubs
8
Essayez :, bash script.shappelez shmake bashpour passer en mode posix. Je me souviens que ce type de question a été répondu. Vous pouvez vous y référer: unix.stackexchange.com/questions/44836/…
cuonglm

Réponses:

34

Exécutez le script en tant que:

bash script.sh

ou juste:

./script.sh

Lorsqu'il bashest exécuté à l'aide du nom sh, il désactive la plupart de ses extensions, telles que l' [[opérateur de test.

Puisque vous avez la #!/bin/bashligne shebang, vous n'avez pas besoin de spécifier explicitement l'interpréteur de shell sur la ligne de commande. L'exécution du script en tant que commande utilisera cette ligne pour trouver le shell.

Barmar
la source
-1

Vos deux if [[ debug = "...“ ]] ; then...commandes sont incorrectes, elles doivent être lues ...

if [ "debug" = "Y" -o "debug" = "y" ]
rhubarbdog
la source
6
Non, le code est valide bash, mais pas valide sh.
glenn jackman
Erreur 1, ligne 22 un problème avec [[.
rhubarbdog
@rhubarbdog Si le has # # / bin / sh alors votre réponse peut fonctionner, si le fichier has #! / bin / bash le if [[debug = "..."]] ne devrait pas être un problème
Rajesh Hatwar