Shell script ném một lỗi không tìm thấy khi chạy từ tệp sh. Nhưng nếu được nhập bằng tay, các lệnh sẽ hoạt động


19

Tôi đang cố gắng sử dụng tập lệnh sau để tạo sơ đồ trang web cho trang web của mình. Khi tôi chạy nó, sh thsitemap.shtôi gặp một lỗi như thế này và tạo một tệp sitemap.xml trống:

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

Nhưng với cùng một người dùng rootkhi tôi sao chép và dán thủ công các dòng này trên thiết bị đầu cuối, nó hoạt động mà không có bất kỳ lỗi nào và tệp sitemap.xml có tất cả các url. Có vấn đề gì vậy? Làm thế nào tôi có thể sửa lỗi này?

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

Làm thế nào bạn chạy kịch bản?
cuonglm

@Gnouc sh script.sh
THpub

8
Hãy thử : bash script.sh, gọi shmake make bashsang chế độ posix. Tôi nhớ loại câu hỏi này đã được trả lời. Bạn có thể tham khảo điều này: unix.stackexchange.com/questions/44836/ trên
cuonglm

Câu trả lời:


33

Chạy tập lệnh dưới dạng:

bash script.sh

hoặc chỉ:

./script.sh

Khi bashđược chạy bằng tên sh, nó sẽ vô hiệu hóa hầu hết các tiện ích mở rộng của nó, chẳng hạn như [[toán tử thử nghiệm.

Vì bạn có #!/bin/bashdòng shebang, bạn không cần chỉ định rõ trình thông dịch shell trên dòng lệnh. Chạy script như một lệnh sẽ sử dụng dòng đó để tìm shell.


-1

Cả ... if [[ debug = "...“ ]] ; then...lệnh của bạn đều không chính xác, họ nên đọc ...

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

6
Không, mã là bash hợp lệ, chỉ là không hợp lệ sh.
glenn jackman

Lỗi 1, dòng 22 một số vấn đề với [[.
đại hoàng

@rhubarbdog Nếu có #! / bin / sh thì câu trả lời của bạn có thể hoạt động, nếu tệp có #! / bin / bash the if [[debug = "...,] không phải là vấn đề
Rajesh Hatwar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.