Python syntax error in unit tests : Okay, so I hate doing this because it's the sort of thing that should be simple and not need SO questions but I'm not a Python dev and I'm trying to debug some unit tests that have been provided for testing an integration.

I'm sure this worked last time I tested it on my local machine, but that seems to have changed - the file hasn't been altered, so I don't know what's changed since then.

I have stripped out the identifying comments and changed some names from the original unit tests because it's proprietary software and I probably shouldn't be posting it at all but I'm out of patience right now.

The syntax error is: 

      File "unitTests.sh", line 39
        gLastFullPath=`python -c "import os; print os.path.realpath('${1}')"`
                     ^
    SyntaxError: invalid syntax

The full script is here:

    #!/bin/bash
    
    # If non-zero, then run in debug mode, outputting debug information
    debug=0
    
    # Set the following to 1 to force an error for testing purposes
    forceError=0
    
    separator="===================================================================================================="
    
    #-------------------------------------------------------------------------------
    # Convert the specified path to a full path and return it in the gLastFullPath
    # global variable.
    #
    # Input params:
    #	$1	- Path to convert to full
    #
    # Output params:
    #	$gLastFullPath	-	Set to the converted full path
    gLastFullPath=""
    getFullPath()
    {
    	# Use Python (because it's easier than Bash) to convert the passed path to
    	# a full path.
    	gLastFullPath=`python -c "import os; print os.path.realpath('${1}')"`
    }
    
    #-------------------------------------------------------------------------------
    fatalError()
    {
    	echo "${separator}"
    	echo "Fatal Error: $1"
    	echo "${separator}"
    	exit 1
    }
    
    #-------------------------------------------------------------------------------
    # If a file or folder exists at the specified path, then delete it. If it's a
    # directory, then its entire contents is deleted.
    #-------------------------------------------------------------------------------
    deleteIfExists()
    {
    	if [[ 0 -ne $debug ]]; then
    		echo "deleteIfExists called..."
    	fi
    	
    	if [[ -e "$1" ]]; then
    		# If it's a directory, then make sure it contains no locked files
    		if [[ -d "$1" ]]; then
    			chflags -R nouchg "$1"
    		fi
    		
    		if [[ 0 -ne $debug ]]; then
    			echo "  Deleting the existing file or directory:"
    			echo "    $1"
    		fi
    
    		# Do the remove and check for an error.
    		/bin/rm -rf "$1"
    		if [[ $? -ne 0 ]]; then
    			fatalError "Unable to delete $1."
    		fi
    	fi
    	
    	if [[ 0 -ne $debug ]]; then
    		echo
    	fi
    }
    
    
    #-------------------------------------------------------------------------------
    # Script starts here
    #-------------------------------------------------------------------------------
    
    # Get the full path to this script
    scriptPath=`which "$0"`
    getFullPath "${scriptPath}"
    scriptFullPath="${gLastFullPath}"
    scriptDir=`dirname "${scriptFullPath}"`
    scriptName=`basename "${scriptFullPath}"`
    
    if [[ 0 -ne $debug ]]; then
    	echo "$scriptName: Debug tracing is on."
    	echo
    fi
    
    # Get the SDK project root path
    getFullPath "${scriptDir}/.."
    projRoot="${gLastFullPath}"
    
    # Get the top of the server tree
    getFullPath "${projRoot}/SUBSYS_TOP"
    subsysTop="${gLastFullPath}"
    
    libPythonBase="${projRoot}/src/lib/py/devilsoftPy"
    devilsoftPython="${libPythonBase}/devilsoftpy"
    
    if [[ 0 -ne $debug ]]; then
    	echo "$scriptName: Project root dir:     \"${projRoot}\""
    	echo "$scriptName: SUBSYS_TOP:           \"${subsysTop}\""
    	echo "$scriptName: Lib python base:      \"${libPythonBase}\""
    	echo "$scriptName: devilsoft python:    \"${devilsoftPython}\""
    	echo
    fi
    
    # First we have to launch the test python server. This is used by some of the other client tests to 
    # run against.
    testServer="${devilsoftPython}/test/TestServer.py"
    if [[ ! -f "${testServer}" ]]; then
    	fatalError "Could not find the expected test server: \"${testServer}\""
    fi
    
    # Carve out a place for our test server log file
    tempFolder="/tmp/devilsoft"
    mkdir -p "${tempFolder}"
    testServerLogFile="${tempFolder}/TestServer.log"
    
    echo "Starting the test server: \"${testServer}\""
    echo "  Logging to this file:   \"${testServerLogFile}\""
    export PYTHONPATH="${libPythonBase}:${PYTHONPATH}"; "${testServer}" > "${testServerLogFile}" 2>&1 &
    testServerPid=$!
    echo "  Server started with pid ${testServerPid}..."
    echo
    
    echo "  Taking a little snooze to let the test server initialize..."
    sleep 2
    
    # If we're forcing errors for testing, then kill the test server. This will cause downstream scripts
    # to fail because there will be no server to talk to.
    if [[ $forceError -ne 0 ]]; then
    	echo "Forcing downstream errors by killing the test server..."
    	kill ${testServerPid}
    	wait ${testServerPid}
    	testServerPid=0
    	echo
    fi
    
    testResultsLogFile="${tempFolder}/TestResults.log"
    echo "Testing each python script in the library..."
    echo "  Test results will be written to this log file: \"${testResultsLogFile}\""
    echo
    deleteIfExists "${testResultsLogFile}"
    
    # Save and set the field separator so that we can handle spaces in paths
    SAVEIFS=$IFS
    IFS=$'\n'
    
    failedScripts=()
    lastError=0
    pythonSources=($(find "${devilsoftPython}" -name '*.py'  ! -name '*.svn*' ! -name '__init__.py' ! -name 'TestServer.py' ! -name 'ServerClient.py'))
    for pythonSourceFile in ${pythonSources[*]}; do
    	echo "  Testing python source \"${pythonSourceFile}\""
    	export PYTHONPATH="${libPythonBase}:${PYTHONPATH}"; "${pythonSourceFile}" >> "${testResultsLogFile}" 2>&1
    	result=$?
    	if [[ $result -ne 0 ]]; then
    		pythonSourceName=`basename "${pythonSourceFile}"`
    		echo "    Error ${result} returned from the above script ${pythonSourceName}!"
    		lastError=${result}
    		failedScripts+=("${pythonSourceFile}")
    	fi
    done
    echo
    
    # Restore the original field separator
    IFS=$SAVEIFS
    
    if [[ ${testServerPid} -ne 0 ]]; then
    	echo "Telling the test server to quit..."
    	kill ${testServerPid}
    	wait ${testServerPid}
    	echo
    fi
    
    # If we got an error, tell the user
    if [[ $lastError -ne 0 ]]; then
    	echo "IMPORTANT! The following scripts failed with errors:"
    	for failedScript in "${failedScripts[@]}"; do
    	   echo "  \"${failedScript}\""
    	done
    	echo
    	
    	fatalError "Review the log files to figure out why the above scripts failed."
    fi
    
    echo "${separator}"
    echo " Hurray! All tests passed!"
    echo "${separator}"
    echo
    
    exit 0

This is all being run in Python 2.7