为什么我的脚本会返回语法错误?

the*_*oxv 1 bash scripts

我写了这个脚本,但不知道为什么会出现语法错误:

#!/bin/bash
    echo Indica la fecha de hoy en formato dd-mm-aaaa
    read date
    echo Indica la hora actual en formato hh-mm
    read hora
    mkdir -p /re/plugins
    shopt -s extglob
    cp -R /files/spigot/plugins/!(dynmap) /re/plugins
    shopt -u extglob
    cp -R /files/spigot/world /re
    zip -r "$date"-"$hora".zip plugins world
    mv /re/*.zip /var/www/html/backup
    rm -R /re
    Echo copia de seguridad realizada correctamente el dia "$date" a las "$hora"h > /log.txt
Run Code Online (Sandbox Code Playgroud)

输出

root@alex:/home/alex# sh pb.sh
Indica la fecha de hoy en formato dd-mm-aaaa
aaa
Indica la hora actual en formato hh-mm
sdf
pb.sh: 7: pb.sh: shopt: not found
pb.sh: 8: pb.sh: Syntax error: "(" unexpected
root@alex:/home/alex# 
Run Code Online (Sandbox Code Playgroud)

Set*_*eth 9

你的问题就在这里:

root@alex:/home/alex# sh pb.sh  
Run Code Online (Sandbox Code Playgroud)

shopt是一个内置的 shell(参见type shopt)。/bin/sh不是 Ubuntu 上的 bash,而是一个名为 dash 的兼容 shell。Dash 没有shopt

由于脚本的第一行是 shebang 行 ( #!/bin/bash),因此您可以像这样运行脚本:

./pb.sh  
Run Code Online (Sandbox Code Playgroud)

它应该可以正常工作。您可能需要通过运行将文件设置为可执行文件:

chmod +x pb.sh
Run Code Online (Sandbox Code Playgroud)