Diferencias entre Tcsh y Bash

Tcsh es mayormente compatible con Bash y otros interpretes de comandos, pero cuenta con algunas diferencias notables, que lo hacen idiosincratico. Esto implica diferencias con la sintaxis de Bash

Hola Mundo

Para iniciar guiones con el, solo debes modificar la primera linea de llamada (el "bang").

#!/bin/tcsh -f
echo "Hello World"

Variables

La sintaxis es diferente a Bash. Para configurar el valor de una variable, debemos utilizar la palabra reservada set =:

#!/bin/tcsh -f

set NAME = "Tutoriales Texto-plano.xyz"
echo $NAME

set launchdate = "Feb 25, 2023"
echo $launchdate

En tcsh Todas las variables se comportan como variables globales.

Las variables de Ambiente pueden accederse directamente (e.g., $PATH, $SHELL, $HOME, $LANG, $PWD, etcetera).

Comentarios

Los comentarios de una linea son similares a Bash. Tcsh no soporta comentarios multilinea.

Depurado

A diferencia de Bash, no se puede activar o desactivar el depurado dentro de un guion tcsh. En su lugar, podremos ejecutar un guion de tcsh en modo de trazado linea a linea, de la siguiente manera:

tcsh -xv guion.csh

Codigos de salida

A diferencia de Bash, en tcsh al ejecutar guiones con trozos de codigo erroneo, el mismo detendra su ejecucion. Podra observarse tal comportamiento coN:

#!/bin/tcsh -f

rm -f /tmp/fichero_prueba.txt
echo "hola" > /tmp/fichero_prueba.txt
ls -l /tmp/fichero_prueba.txt
chmod 0444 /tmp/fichero_prueba.txt
ls -l /tmp/fichero_prueba.txt
echo "hola" > /tmp/fichero_prueba.txt
echo "No puedo llegar a esta linea de codigo."

Argumentos de linea de comando

La sintaxis es diferente a bash. TCsh carece de indicadores de argumentos como los $@ y $? de Bash. Los Argumentos de linea de comando se acceden con $argv[$i] (donde $i representa un argumento de rango numerico (denotado por $n), mientras que $n devuelve el valor de argumentos de linea de comandos.

He aqui un programa que almacena los argumentos de linea de comandos en una lista y luego los presenta:

#!/bin/tcsh -f

set num_args = $#
set i = 1
set list = ( )
echo "Arma la lista de los argumentos de linea de comandos..."
while ($i <= $num_args)
    @ i_minus_1 = $i - 1
    set arg = $argv[$i]
    echo "\targ[$i_minus_1] = $arg"
    set list = ( $list $arg )
    @ i = $i + 1
end
echo "Ahora imprimo la lista..."
foreach f ($list)
    echo "\t$f"
end

Comandos de Shell

Tcsh tambien utiliza acentos graves ... para correr comandos de shell, de la misma forma que lo hace Bash.

Entradas del usuario

La sintaxis de TCSh es muy diferente a la de Bash. El siguiente codigo demuestra como leer una cadena del usuario empleando $<:

#!/bin/tcsh -f

echo -n "Ingresa un numero escogido al azar entre 1 y 10: "
set x = $<
if ($x < 1 || $x > 10) then
    echo "Entrada invalida: $x"
else
    echo "Ha ingresado: $x"
endif

Operaciones aritmeticas

La sintaxis de tcsh es muy diferente a la de Bash. Realiza operaciones aritmeticas comienza la linea con @.

Por ejemplo:

@ x = (354 - 128 + 52 * 5 / 3)

Comparacion Numerica

Su sintaxis es similar a la de Bash, con la excepcion de que no necesitamos dos pares de parentesis (()). Por favor refiera al ejemplo anterior para comparar $i y num_args.

Comparacion de Cadenas

La sintaxis de Tcsh es similar a la de Bash. El codigo siguiente lee una cadena del usuario, revisa para var que no sea una cadena vacia. Si no lo es, realiza una comparacion de patron para observar si la cadena finaliza con .txt.

#!/bin/tcsh -f

echo -n "Ingresa un nombre de fichero: "
set name = $<
if ($name == "") then
    echo "Ingreso una cadena vacia?"
else
    if ($name =~ "*.txt") then
        echo "Nombre del fichero txt: $name"
    else
        echo "No es un fichero txt: $name"
    endif
endif

If-else

La sintaxis de Tcsh es diferente a la de Bash. Observe el ejemplo anterior para considerar la declaracion anidada if-then-else.

bucle For

La sintaxis de Tcsh es diferente de la de Bash. En lugar de emplear for, tcsh utiliza foreach. Observe el ejemplo anterior para consultar el uso de foreach en una lista lista iterativa.

Bucle While

La sintaxis de Tcsh es ligeramente diferente a la de Bash. Por favor consulta el ejemplo anteior en busqueda de un bucle while en tanto la condicion sea verdadera.

Case

La sintaxis de Tcsh es diferente a la de Bash. El codigo a continuacion leera una cadena del usuario, revisara si iguala a uno de los casos provistos.

#!/bin/tcsh -f

echo -n "Ingrese un numero al azar entre 1 y 10: "
set x = $<
switch ( $x )
case "1", "3", "5", "7", "9":
    echo "Ha ingresado un numero impar entre 1 y 10: $x"
    breaksw
case "2", "4", "6", "8", "10":
    echo "Ha ingresado un numero par entre 1 y 10: $x"
    breaksw
default:
    echo "Ha ingresado: $x"
endsw

Funciones

A diferencia de Bash, Tcsh no soporta funcion alguna.

En este aspecto, ¡Bash es claramente superior a Tcsh!