शेल स्क्रिप्ट एक sh फ़ाइल से चलाने पर नहीं मिली त्रुटि को फेंकता है। लेकिन अगर मैन्युअल रूप से दर्ज किए गए कमांड काम करते हैं


19

मैं अपनी वेबसाइट के लिए साइटमैप बनाने के लिए निम्न स्क्रिप्ट का उपयोग करने का प्रयास कर रहा हूं। जब मैं इसे चलाता sh thsitemap.shहूं जैसे ही मुझे कोई त्रुटि मिलती है और एक खाली साइटमैप बनाता है। xml फ़ाइल:

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

लेकिन उसी उपयोगकर्ता के रूप में rootजब मैं टर्मिनल पर इन पंक्तियों को मैन्युअल रूप से कॉपी और पेस्ट करता हूं, तो यह बिना किसी त्रुटि के काम करता है और साइटमैप। xml फ़ाइल में सभी यूआरएल हैं। समस्या क्या है? मैं इसे कैसे ठीक करूं?

#!/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

आप स्क्रिप्ट कैसे चलाते हैं?
cuonglm

@Gnouc sh script.sh
THpubs

8
प्रयास करें: bash script.sh, बुला shकर bashPOSIX मोड पर स्विच करें। मुझे याद है कि इस प्रकार के प्रश्न का उत्तर दिया गया है। आप इसका उल्लेख कर सकते हैं: unix.stackexchange.com/questions/44836/…
cuonglm

जवाबों:


35

स्क्रिप्ट को इस रूप में चलाएँ:

bash script.sh

या केवल:

./script.sh

जब bashनाम का उपयोग करके चलाया जाता है sh, तो यह अपने अधिकांश एक्सटेंशन को निष्क्रिय कर देता है, जैसे कि [[परीक्षण ऑपरेटर।

चूंकि आपके पास #!/bin/bashशेलबैंग लाइन है, इसलिए आपको कमांड लाइन पर शेल इंटरप्रेटर को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता नहीं है। स्क्रिप्ट को कमांड के रूप में चलाने से शेल को खोजने के लिए उस लाइन का उपयोग किया जाएगा।


-1

आपके दोनों ... if [[ debug = "...“ ]] ; then...आदेश गलत हैं जिन्हें उन्हें पढ़ना चाहिए ...

if [ "debug" = "Y" -o "debug" = "y" ]

6
नहीं, कोड वैध बैश है, बस मान्य श नहीं है।
ग्लेन जैकमैन

त्रुटि 1, पंक्ति 22 कुछ मुद्दे [[के साथ।
रबर्बोग

@rhubarbdog यदि आपके पास #! / बिन / श है तो आपका उत्तर काम कर सकता है, यदि फ़ाइल में #! / बिन / बैश है तो [[डिबग = "..."]] कोई समस्या नहीं होनी चाहिए
राजेश हटवार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.