Shell-Skript gibt einen nicht gefundenen Fehler aus, wenn es aus einer sh-Datei ausgeführt wird. Bei manueller Eingabe funktionieren die Befehle jedoch

19

Ich versuche, mithilfe des folgenden Skripts eine Sitemap für meine Website zu erstellen. Wenn ich es wie sh thsitemap.shfolgt ausführe, erhalte ich eine Fehlermeldung und erstelle eine leere sitemap.xml-Datei:

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

Aber als derselbe Benutzer, rootwenn ich diese Zeilen manuell kopiere und auf dem Terminal einfüge, funktioniert es fehlerfrei und die Datei sitemap.xml enthält alle URLs. Was ist das Problem? Wie kann ich das beheben?

#!/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
quelle
Wie führen Sie das Skript aus?
16.
@ Gnouc sh script.sh
THpubs
8
Versuchen Sie Folgendes : bash script.shRufen Sie shmake auf, bashum zum Posix-Modus zu wechseln. Ich erinnere mich, dass diese Art von Frage beantwortet wurde. Sie können sich darauf beziehen: unix.stackexchange.com/questions/44836/…
cuonglm

Antworten:

33

Führen Sie das Skript aus als:

bash script.sh

oder nur:

./script.sh

Wenn bashes unter Verwendung des Namens ausgeführt wird sh, werden die meisten seiner Erweiterungen deaktiviert, z. B. der [[Testoperator.

Da Sie die #!/bin/bashshebang-Zeile haben, müssen Sie den Shell-Interpreter nicht explizit in der Befehlszeile angeben. Wenn Sie das Skript als Befehl ausführen, wird diese Zeile verwendet, um die Shell zu finden.

Barmar
quelle
-1

Beide Ihre ... if [[ debug = "...“ ]] ; then...Befehle sind falsch, sie sollten lesen ...

if [ "debug" = "Y" -o "debug" = "y" ]
Rhabarberhund
quelle
6
Nein, der Code ist gültig, nur nicht gültig, sh.
Glenn Jackman
Fehler 1, Zeile 22 Probleme mit [[.
Rhabarberhund
@rhubarbdog Wenn der #! / bin / sh hat, dann funktioniert Ihre Antwort möglicherweise, wenn die Datei #! / bin / bash hat, sollte das if [[debug = "...“] kein Problem sein
Rajesh Hatwar