O problema foi resolvido na seção de comentários.
Resumo:
Os arquivos, tanto o script quanto possivelmente o arquivo de dados, eram arquivos de texto do DOS. No Unix, isso significa que eles tinham um \r (retorno de carro) supérfluo no final de cada linha.
Para o script, isso significa que a atribuição de variável
Temp=Kerala
atribuiu o valor Kerala\r à variável Temp . Como o arquivo de dados não continha esse valor, nunca foi encontrado.
A execução do script com o valor inserido no lugar da variável funcionou, uma vez que, naquele local nos dados, não foi afetado pelo problema de texto do DOS.
O utilitário dos2unix deve ser instalado e executado nos dois arquivos para garantir que sejam arquivos de texto Unix. Veja também outras questões neste site relacionadas a este utilitário.
O script também poderia ter sido escrito assim:
#!/bin/sh
Temp='Kerala'
cs1=$( awk -v pattern="$Temp" '$1 ~ pattern { print $NF }' State_list.txt )
printf '%s\n' "$cs1"
Isso elimina grep e usa awk em seu lugar para procurar por qualquer linha na primeira coluna do arquivo de dados que contenha pattern (uma variável atribuída a $Temp na linha de comando) . Com == no lugar de ~ , uma correspondência de cadeia exata é executada em vez de uma correspondência de expressão regular.
O script é um script sh , uma vez que (e o original) não usa nenhum recurso ksh especial.