• Guest, before posting your code please take these rules into consideration:
    • It is required to use our BBCode feature to display your code. While within the editor click < / > or >_ and place your code within the BB Code prompt. This helps others with finding a solution by making it easier to read and easier to copy.
    • Don't share a wall of code. All we want is the problem area, the code related to your issue.


    To learn more about how to use our BBCode feature, please click here.

    Thank you, Code Forum.

install.sh: 364: Syntax error: "(" unexpected (expecting "done")

Johna

Frontend developer
Staff Team
Guardian
Hi all,
I'm trying to install Canon printer drivers on my linux mint device.
I've downloaded the drivers from https://www.canon.co.uk/ (Canon i-SENSYS MF4730) and I'm trying to install it by running the install.sh
I've opened a terminal in the directory, and then I typed sh install.sh, but I get this error: install.sh: 364: Syntax error: "(" unexpected (expecting "done").
I don't know what it means or how to fix it.

Here's the install.sh's content.
Bash:
#!/bin/bash

##############################################################################
##
##  Canon Laser Printer Driver for Linux
##  Copyright CANON INC. 2015
##
##  This program is free software; you can redistribute it and/or modify
##  it under the terms of the GNU General Public License as published by
##  the Free Software Foundation; either version 2 of the License, or
##  (at your option) any later version.
##
##  This program is distributed in the hope that it will be useful,
##  but WITHOUT ANY WARRANTY; without even the implied warranty of
##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##  GNU General Public License for more details.
##
##  You should have received a copy of the GNU General Public License
##  along with this program; if not, write to the Free Software
##  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
##
##############################################################################


#-------------------------------------------------#
# install package list define
#  0x01:CARPS2/UFR2LT Driver
#  0x02:LIPSLX/UFR2 Driver
#  0x04:LIPS4 Driver
#-------------------------------------------------#
INSTALL_PACKAGE_RPM_32="
0x02:libjpeg-turbo
0x06:beecrypt
0x06:beecrypt-devel
0x07:gtk3
0x03:jbigkit-libs
0x04:zlib"

REPLACE_PACKAGE_RPM_32="
beecrypt,libgcrypt
beecrypt-devel,libgcrypt-devel"

INSTALL_PACKAGE_RPM_64="
0x02:libjpeg-turbo
0x06:beecrypt
0x06:beecrypt-devel
0x07:gtk3
0x03:jbigkit-libs
0x04:zlib"

REPLACE_PACKAGE_RPM_64="
beecrypt,libgcrypt
beecrypt-devel,libgcrypt-devel"

INSTALL_PACKAGE_DEB_32="
0x07:libgtk-3-0
0x02:libjpeg62
0x06:libbeecrypt7
0x06:libbeecrypt-dev
0x03:libjbig0
0x04:zlib1g"

REPLACE_PACKAGE_DEB_32="
libbeecrypt7,libgcrypt20
libbeecrypt-dev,libgcrypt20-dev"

INSTALL_PACKAGE_DEB_64="
0x07:libgtk-3-0
0x02:libjpeg62
0x06:libbeecrypt7
0x06:libbeecrypt-dev
0x03:libjbig0
0x04:zlib1g"

REPLACE_PACKAGE_DEB_64="
libbeecrypt7,libgcrypt20
libbeecrypt-dev,libgcrypt20-dev"

APT_GET_RUN_ONCE_FLAG=""

#-------------------------------------------------#
# install message
#-------------------------------------------------#
INST_COM_01_01="#----------------------------------------------------#"

INST_ERR_01_01="The current user is %s.
Change user to root, and then perform installation again."
INST_ERR_02_01="Could not install."
INST_MSG_01_01="This installer is recommended for the following distributions that are currently supported as of the release of this installer:
- Fedora/Ubuntu/CentOS/Debian/UOS/Kylin OS/NeoKylin OS

If this installer is run under distributions for which the support period has ended, the installation of additional system libraries may be necessary after driver installation is complete.

Note that an internet connection is required for installation.

Do you want to continue with installation? (y/n)"
INST_MSG_01_02="This installer is recommended for the following distributions that are currently supported as of the release of this installer:
- Fedora/Ubuntu/CentOS/Debian

If this installer is run under distributions for which the support period has ended, the installation of additional system libraries may be necessary after driver installation is complete.

Note that an internet connection is required for installation.

Do you want to continue with installation? (y/n)"
INST_MSG_02_01="Some system libraries could not be installed.
Refer to the Readme file for more information.
Do you want to continue with installation? (y/n)"
INST_MSG_03_01="Installation is complete.
Do you want to register the printer now? (y/n)"

LC_FILE_DIR="resources"
LC_FILE="no_localize"   
LANG_INFO=`echo $LANG | tr '[:upper:]' '[:lower:]'`
case "${LANG_INFO##*.}" in
    utf8 | utf-8)
        case "${LANG_INFO%%.*}" in
            ja_jp)
                LC_FILE="installer_ja_utf8.lc"
            ;;
            fr_fr)
                LC_FILE="installer_fr_utf8.lc"
            ;;
            it_it)
                LC_FILE="installer_it_utf8.lc"
            ;;
            de_de)
                LC_FILE="installer_de_utf8.lc"
            ;;
            es_es)
                LC_FILE="installer_es_utf8.lc"
            ;;
            zh_cn)
                LC_FILE="installer_zh_CN_utf8.lc"
            ;;
            ko_kr)
                LC_FILE="installer_ko_utf8.lc"
            ;;
            zh_tw)
                LC_FILE="installer_zh_TW_utf8.lc"
            ;;
            *)
                LC_FILE="installer_en_utf8.lc"
            ;;
        esac
    ;;
esac

#-------------------------------------------------#
# etc. define
#-------------------------------------------------#
DRIVER_FLAG=0
ERROR_CHECK=0
DRIVER_ERROR_CHECK=0
MACHINE_TYPE=""
PACKAGE_TYPE=""
RELEASE_DIR=""
DRIVER_PACKAGE=""
INSTALL_PACKAGE=""
INSTALL_CMD=""
INSTALL_OPT=""
INSTALL_PACKAGE_CMD=""

LIST_SPACE=" "

COLOR_K='\033[1;30m'
COLOR_R='\033[1;31m'
COLOR_G='\033[1;32m'
COLOR_Y='\033[1;33m'
COLOR_B=''
COLOR_M='\033[1;35m'
COLOR_C='\033[1;36m'
COLOR_OFF='\033[m'


#-------------------------------------------------#
# common function
#-------------------------------------------------#
C_output_log()
{
    echo -e -n $COLOR_B
    echo -e $INST_COM_01_01
    echo -e "# $1"
    echo -e $INST_COM_01_01
    echo -e -n $COLOR_OFF
}


C_output_message()
{
    echo -e -n $COLOR_B
    echo -e "$1"
    echo -e -n $COLOR_OFF
}


C_output_error_message()
{
    echo -e -n $COLOR_R
    echo -e "$1"
    echo -e -n $COLOR_OFF
}


C_check_distribution()
{   
    if [ $DRIVER_FLAG -eq 4 ]; then
        read -p "$INST_MSG_01_02" ans
    else
        read -p "$INST_MSG_01_01" ans
    fi
    if [ "$ans" != "y" -a "$ans" != "Y" ]; then
        exit 1
    fi
    echo
}


C_set_driver_flag()
{
    find . -name "*$MACHINE_TYPE.$PACKAGE_TYPE" | grep -i -e carps2 -e ufr2lt > /dev/null 2>&1
    if [ "${?}" -eq 0 ]; then
        DRIVER_FLAG=$(($DRIVER_FLAG | 0x01))
    fi

    find . -name "*$MACHINE_TYPE.$PACKAGE_TYPE" | grep -i -e lipslx  -e ufr2- > /dev/null 2>&1
    if [ "${?}" -eq 0 ]; then
        DRIVER_FLAG=$(($DRIVER_FLAG | 0x02))
    fi

    find . -name "*$MACHINE_TYPE.$PACKAGE_TYPE" | grep -i -e lips4 > /dev/null 2>&1
    if [ "${?}" -eq 0 ]; then
        DRIVER_FLAG=$(($DRIVER_FLAG | 0x04))
    fi
    
}


C_check_driver_and_install_package()
{
    local lc_package_flag=`echo $INSTALL_PACKAGE | cut -d ':' -f1`

    if [ $(($lc_package_flag & $DRIVER_FLAG)) = $DRIVER_FLAG ]; then
        INSTALL_PACKAGE=`echo $INSTALL_PACKAGE | cut -d ':' -f2-`
    else
        INSTALL_PACKAGE=""   
    fi
}
    

C_check_directory()
{
    echo "${0}" | grep '/' >/dev/null  2>&1
    if [ "${?}" -eq 0 ]; then
        shell_dir="${0%/*}"
        cd "${shell_dir}"
    fi
}


C_init_cups()
{
    C_output_log "cups $1"

    if [ -f /etc/init.d/cups ]
    then
        CMD="/etc/init.d/cups $1"
        echo $CMD
        $CMD
    elif [ -f /etc/init.d/cupsys ]
    then
        CMD="/etc/init.d/cupsys $1"
        echo $CMD
        $CMD
    else
        CMD="service cups $1"
        echo $CMD
        $CMD
    fi
    echo
}


C_update()
{
    case $PACKAGE_TYPE in
    'deb')
        if [ -z $APT_GET_RUN_ONCE_FLAG  ]; then
            C_output_log "apt-get update"
            apt-get update
            APT_GET_RUN_ONCE_FLAG="DONE"
        fi
        echo
        ;;
    'rpm')
        C_output_log "$INSTALL_PACKAGE_CMD upgrade"
        for upgrade_pkg in ${1}
        do
            INSTALL_PACKAGE=$upgrade_pkg

            if [ "$2" != "REPLACE" ]; then
                C_check_driver_and_install_package
                if [ "$INSTALL_PACKAGE" = "" ]; then
                    continue;
                fi
            fi
            echo "$INSTALL_PACKAGE"
            $INSTALL_PACKAGE_CMD -y upgrade $INSTALL_PACKAGE
            echo
        done
        ;;
    esac
    echo
}


C_install_package()
{
    C_output_log "$INSTALL_PACKAGE_CMD install"

    $INSTALL_PACKAGE_CMD -y install $INSTALL_PACKAGE

    echo
}


C_install_package_check()
{
    C_output_log "Install Package Check"

    replace_list=""
    err_check=0
    for inst_pkg in $INSTALL_PACKAGE
    do
        if [ -d "/etc/yum.repos.d" ];
        then
            echo $inst_pkg | grep '\.'  > /dev/null 2>&1
            if [ $? -eq 0 ]; then
                LIB_NAME=`echo $inst_pkg | cut -d '.' -f1`
                ARCH=`echo $inst_pkg | cut -d '.' -f2`
                rpm -qa | grep -i $LIB_NAME | grep -i $ARCH > /dev/null 2>&1
            else
                rpm -qa | grep -i $inst_pkg > /dev/null 2>&1
            fi
        else
            echo $inst_pkg | grep ":" > /dev/null 2>&1
            if [ $? -eq 0 ]; then
                LIB_NAME=`echo $inst_pkg | cut -d ':' -f1`
                ARCH=`echo $inst_pkg | cut -d ':' -f2`
                dpkg -l | grep -i $LIB_NAME | grep -i $ARCH > /dev/null 2>&1
            else
                dpkg -l | grep -i $inst_pkg > /dev/null 2>&1
            fi
        fi

        if [ $? -eq 0 ]; then
            C_output_message " OK: $inst_pkg"
        else
            #C_output_error_message   " NG: $inst_pkg"
            replace_pkg=""
            for check_pkg in $REPLACE_PACKAGE
            do
                IFS_BACK=$IFS
                IFS=','
                array=($check_pkg)
                IFS=$IFS_BACK
                if [ ${array[0]} = $inst_pkg ]; then
                    replace_pkg=${array[1]}
                fi
            done
            if [ "$replace_pkg" != "" ]; then
                replace_list=$replace_list$LIST_SPACE$replace_pkg
                C_output_error_message   " Replace: $inst_pkg -> $replace_pkg"
            else
                C_output_error_message   " NG: $inst_pkg"
                ERROR_CHECK=1
                err_check=1
            fi
        fi
    done

    echo

    if [ $err_check -eq 0 ]; then
        if [ "$replace_list" != "" ]; then
            INSTALL_PACKAGE=$replace_list
            C_update "${INSTALL_PACKAGE[@]}" "REPLACE"
            C_install_package
            C_install_package_check
        fi
    fi
}


C_install_printer_driver()
{
    C_output_log "Install Printer Driver ($INSTALL_CMD $INSTALL_OPT)"

    unset DRIVER_PACKAGE
    DRIVER_PACKAGE=`find . -name "*$MACHINE_TYPE.$PACKAGE_TYPE"`
    $INSTALL_CMD $INSTALL_OPT $DRIVER_PACKAGE
    if [ $? -ne 0 ]; then
        DRIVER_ERROR_CHECK=1
    fi

    unset DRIVER_PACKAGE
    DRIVER_PACKAGE=`find PPD -name "*.$PACKAGE_TYPE" | grep -i cnrcups`
    if [ "$DRIVER_PACKAGE" != "" ]; then

        $INSTALL_CMD $INSTALL_OPT $DRIVER_PACKAGE
        if [ $? -ne 0 ]; then
            DRIVER_ERROR_CHECK=1
        fi
    fi

    echo
}

#-------------------------------------------------#
# start install.sh
#-------------------------------------------------#
main()
{
    install_package_list=""
    
    #---------------------
    # check directory
    #---------------------
    C_check_directory

    #---------------------
    # localize
    #---------------------
    if [ -f ${LC_FILE_DIR}/${LC_FILE} ]; then
        source ${LC_FILE_DIR}/${LC_FILE}
    fi

    #---------------
    # check root
    #---------------
    if test `id -un` != "root"; then
        echo -e -n $COLOR_R
        printf "$INST_ERR_01_01" `id -un`
        echo -e -n $COLOR_OFF
        echo
        exit 1
    fi
    
    #------------------------
    # get distribution data
    #------------------------
    case `uname` in
    'SunOS')
        EXE_PATH='/opt/sfw/cups/sbin'
        ;;
    'HP-UX')
        EXE_PATH='/usr/sbin:/usr/bin'
        ;;
    'AIX')
        EXE_PATH='/usr/sbin:/usr/bin'
        ;;
    'Linux')
        EXE_PATH='/usr/sbin:/usr/bin'
        ;;
    esac
    
    export PATH=$EXE_PATH:$PATH
    
    if [ -d "/etc/yum.repos.d" ];
    then
        PACKAGE_TYPE="rpm"
        INSTALL_CMD="rpm"
        INSTALL_OPT="-Uvh --replacepkgs --replacefiles"
        if which yum > /dev/null 2>&1;
        then
            INSTALL_PACKAGE_CMD="yum"
        else
            INSTALL_PACKAGE_CMD="dnf"
        fi

        case `uname -m` in     
        'i386'|'i686')     
            MACHINE_TYPE="i386"     
            install_package_list=$INSTALL_PACKAGE_RPM_32
            REPLACE_PACKAGE=$REPLACE_PACKAGE_RPM_32
            ;;     
        'x86_64')     
            MACHINE_TYPE="x86_64"     
            install_package_list=$INSTALL_PACKAGE_RPM_64
            REPLACE_PACKAGE=$REPLACE_PACKAGE_RPM_64
            ;;
        'aarch64')
            MACHINE_TYPE="aarch64"
            install_package_list=$INSTALL_PACKAGE_RPM_64
            REPLACE_PACKAGE=$REPLACE_PACKAGE_RPM_64
            ;;
        'mips64')     
            MACHINE_TYPE="mips64el"
            install_package_list=$INSTALL_PACKAGE_RPM_64
            REPLACE_PACKAGE=$REPLACE_PACKAGE_RPM_64
            ;;     
        esac
    else
        PACKAGE_TYPE="deb"
        INSTALL_CMD="dpkg"
        INSTALL_OPT="-i -G --force-overwrite"
        INSTALL_PACKAGE_CMD="apt-get"
    
        case `uname -m` in     
        'i386'|'i686')     
            MACHINE_TYPE="i386"     
            install_package_list=$INSTALL_PACKAGE_DEB_32
            REPLACE_PACKAGE=$REPLACE_PACKAGE_DEB_32
            ;;     
        'x86_64')     
            MACHINE_TYPE="amd64"     
            install_package_list=$INSTALL_PACKAGE_DEB_64
            REPLACE_PACKAGE=$REPLACE_PACKAGE_DEB_64
            ;;
        'aarch64')
            MACHINE_TYPE="arm64"
            install_package_list=$INSTALL_PACKAGE_DEB_64
            REPLACE_PACKAGE=$REPLACE_PACKAGE_DEB_64
            ;;
        'mips64')
            MACHINE_TYPE="mips64el"
            install_package_list=$INSTALL_PACKAGE_DEB_64
            REPLACE_PACKAGE=$REPLACE_PACKAGE_DEB_64
            ;;
        esac
    fi
    
    

    #---------------------
    # set driver flag
    #---------------------
    C_set_driver_flag
    
    #---------------------
    # check distribution
    #---------------------
    C_check_distribution
    
    #------------------------
    # install start
    #------------------------
    C_output_log "Install Start"
    C_output_message "Machine Type = $MACHINE_TYPE"
    C_output_message "Package Type = $PACKAGE_TYPE"
    
    DRIVER_PACKAGE=`find . -name "*$MACHINE_TYPE.$PACKAGE_TYPE" | sort 2> /dev/null`
    C_output_message "Package list = "
    
    for list in $DRIVER_PACKAGE
    do
        C_output_message "    $list"
    done
    echo
    
    #---
    C_update "${install_package_list[@]}" "UPDATE"
    for package in $install_package_list
    do
        INSTALL_PACKAGE=$package

        C_check_driver_and_install_package
        if [ "$INSTALL_PACKAGE" = "" ]; then
            continue;
        fi

        C_install_package
        C_install_package_check
    done
    #---

    #---
    if [ $ERROR_CHECK -eq 1 ]; then
        read -p "$INST_MSG_02_01" ans
        if [ "$ans" != "y" -a "$ans" != "Y" ]; then
            exit 1
        fi
        echo
    fi
    #---

    C_install_printer_driver
    C_init_cups restart
}

main $*

if [ $ERROR_CHECK -eq 0 -a $DRIVER_ERROR_CHECK -eq 0 ]
then
    if [ $DRIVER_FLAG -eq 1 ]; then
        MODULE_NAME=cnsetuputil2l
    elif [ $DRIVER_FLAG -eq 2 ]; then
        MODULE_NAME=cnsetuputil2
    else
        MODULE_NAME=cnsetuputill
    fi

    if which $MODULE_NAME > /dev/null 2>&1;
    then
        read -p "$INST_MSG_03_01" ans
        if [ "$ans" != "y" -a "$ans" != "Y" ]; then
            exit 0
        fi
        $MODULE_NAME &
    fi
else
    C_output_error_message "$INST_ERR_02_01"
fi

exit 0

Thanks
 

cbreemer

King Coder
I'm not sure that if you do sh install.sh it will be executed by bash as is the intention.
Have tried just install.sh ?

I have to admit that the offending line 364
Bash:
array=($check_pkg)
looks strange to me, I've never seen such parentheses in shell scripts.
 

Tealk

King Coder
As you can see in the first line it is a bash script and so it will be called via bash.
@cbreemer has suggested the short form of bash which is then written ./

the problem is that many bash scripts are saved with .sh as file extension which is actually wrong. bash scripts actually have no extension at all.
bash and sh are two different shells. Basically bash is sh, with more features and better syntax. Most commands work the same, but they are different.
 

cbreemer

King Coder
the problem is that many bash scripts are saved with .sh as file extension which is actually wrong. bash scripts actually have no extension at all.
bash and sh are two different shells. Basically bash is sh, with more features and better syntax. Most commands work the same, but they are different.
I've worked with shell scripts for almost 30 years, but I wasn't aware that bash scripts are not allowed to have the .sh extension, or even typically have none at all. Is that documented somewhere ? As I remember they can just as well be called .sh, as Unix/Linux (unlike Windows) does not care a fig about file extensions. If a script has features specific to bash, it should start with the #!/bin/bash shebang.
 

Tealk

King Coder
That is correct, it is not a system related problem with the extension, as you correctly said Linux does not care.

Executables should have no extension (strongly preferred) or a .sh extension. Libraries must have a .sh extension and should not be executable.

It is not necessary to know what language a program is written in when executing it and shell doesn’t require an extension so we prefer not to use one for executables.

However, for libraries it’s important to know what language it is and sometimes there’s a need to have similar libraries in different languages. This allows library files with identical purposes but different languages to be identically named except for the language-specific suffix.
 

cbreemer

King Coder
That is correct, it is not a system related problem with the extension, as you correctly said Linux does not care.


I must admit my experience is only about 10% with Linux and 90% with other pre-Linux Unix'es (Solaris, AIX, HP-UX, etc). Also I retired 3 years ago and haven't done any *x since so it could well be things have changed. Certainly Linux with bash is now the norm. But giving executables or libraries a .sh suffix ? That sounds totally bonkers to me.... Can't see what this is supposed to achieve. Indeed executables should not have a suffix, and I'd go as far as saying that all other files should have a suffix. But maybe not, ultimately it's a matter of taste and convention. It's the magic numbers and shebangs that really count.
 

Antero360

King Coder
Staff Team
Security Analyst
late to the party, but 2 things:
1) if you are getting a "not a command" error... have you given the script execute priv?
might wanna run chmod +x scriptName

2) for the "expecting done" error... you might be missing a done somewhere in your loops.
 
Top