A BASH tem um número de operadores de string que você pode usar aqui, mas eu não Veja como fazer isso em apenas um, então você pode usar duas declarações ou um subshell:
echo 'basename ${1%.py}'
Ou, mais geralmente,
echo 'basename ${1%.*}'
Ou com uma variável temporária:
FILE=${1##*/}
echo ${FILE%.*}
Suponho que, desde que você esteja usando um subshell, sed
funcionará também.
echo 'echo $1 | sed 's/.*\/\([^/]*\)\(\.[^./]*\)\?//''
Essa é uma expressão um tanto quanto feia, mas poderia ser limpa se você fizesse algumas suposições sobre a entrada.