Script shell melempar kesalahan yang tidak ditemukan saat dijalankan dari file sh. Tetapi jika dimasukkan secara manual perintahnya bekerja

19

Saya mencoba menggunakan skrip berikut untuk menghasilkan peta situs untuk situs web saya. Ketika saya menjalankannya saat sh thsitemap.shsaya mendapatkan kesalahan seperti ini dan membuat file sitemap.xml kosong:

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

Tetapi sebagai pengguna yang sama rootketika saya secara manual menyalin dan menempelkan baris-baris ini pada terminal, ia bekerja tanpa kesalahan dan file sitemap.xml memiliki semua url. Apa masalahnya? Bagaimana saya bisa memperbaikinya?

#!/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
sumber
Bagaimana Anda menjalankan skrip?
cuonglm
@Gnouc sh script.sh
THpubs
8
Coba :, bash script.shpanggil shmake bashswitch ke mode posix. Saya ingat pertanyaan jenis ini telah dijawab. Anda dapat merujuk ini: unix.stackexchange.com/questions/44836/…
cuonglm

Jawaban:

34

Jalankan skripnya sebagai:

bash script.sh

atau hanya:

./script.sh

Saat bashdijalankan menggunakan nama sh, itu menonaktifkan sebagian besar ekstensi, seperti [[operator pengujian.

Karena Anda memiliki #!/bin/bashgaris shebang, Anda tidak perlu menentukan penerjemah shell secara eksplisit pada baris perintah. Menjalankan skrip sebagai perintah akan menggunakan baris itu untuk menemukan shell.

Barmar
sumber
-1

Kedua ... if [[ debug = "...“ ]] ; then...perintah Anda salah mereka harus membaca ...

if [ "debug" = "Y" -o "debug" = "y" ]
rhubarbdog
sumber
6
Tidak, kodenya adalah bash yang valid, hanya saja sh tidak valid.
glenn jackman
Kesalahan 1, baris 22 beberapa masalah dengan [[.
rhubarbdog
@rhubarbdog Jika has #! / bin / sh maka jawaban Anda mungkin berfungsi, jika file tersebut memiliki #! / bin / bash the if [[debug = "..."]] seharusnya tidak menjadi masalah
Rajesh Hatwar