C Shell
'''csh''' was the shell that William Joy wrote for BSD. '''csh''' accepted the same Unix commands as other shells, but had a very different syntax (for variable assignments, control flow, and such). '''csh''' is not compatible with the Bourne Shell.
BSD keeps the C Shell at /bin/csh. Hashbang lines should use the -f option:
#!/bin/csh -f
Reputation
C Shell is obsolete. Most scriptwriters prefer a Bourne-compatible shell, and few users want to learn two flavors of shells. C Shell introduced tilde expansion (ls ~), job control, command history, and aliases, but POSIX shells now have all of those.
Csh Programming Considered Harmful and Top Ten Reasons not to use the C shell give multiple reasons to avoid C Shell.
tcsh is a later version that fixed many of the problems with csh. It is still actively, if intermittently, maintained and has a following such as on Solaris.
Syntax
The manual for csh(1) claims that C Shell has "a C-like syntax". Several other languages have a C-like syntax, including Java and Pike, and Unix utilities AWK and bc. C Shell is less like C than those other languages.
This example prints a Hailstone sequence from 13.
{| class="wikitable" ! C ! C Shell |- ||
#include <stdio.h>
int
main()
{
int n;
n = 13;
printf("%d\n", n);
while (n != 1) {
if (n % 2)
n = 3 * n + 1;
else
n /= 2;
printf("%d\n", n);
}
return 0;
}
||
@ n = 13
echo $n
while ($n != 1)
if ($n % 2) then
@ n = 3 * $n + 1
else
@ n /= 2
endif
echo $n
end
|}
C Shell has no braces {} to group the commands. Strange keywords are then, endif and end. Expressions have $n instead of n. Assignments use @ n.
C Shell has "a C-like syntax" because C Shell is more like C than Bourne Shell.
{| class="wikitable" ! Bourne Shell ! C Shell |- ||
n=13
echo $n
while test $n -ne 1; do
if expr $n % 2 >/dev/null; then
n=`expr 3 \* $n + 1`
else
n=`expr $n / 2`
fi
echo $n
done
||
@ n = 13
echo $n
while ($n != 1)
if ($n % 2) then
@ n = 3 * $n + 1
else
@ n /= 2
endif
echo $n
end
|}
Bourne Shell requires test or expr to evaluate expressions. C Shell has built-in expressions, so the Hailstone sequence comes more easily. These expressions have a stupid quirk: all operators are right-associative, so 10 - 3 - 2 acts like 10 - (3 - 2). The fix is to use parentheses.
% @ n = 10 - 3 - 2
% echo $n
9
% @ n = (10 - 3) - 2
% echo $n
5
Links
- OpenBSD has csh(1) manual and source code.
Tasks
- A+B
- Comments
- Conditional structures
- Enforced immutability
- Ethiopian multiplication
- Execute a system command
- Factorial
- FizzBuzz
- Guess the number
- Hello world!
- Hello world/Newline omission
- Hello world/Standard error
- Hello world/Text
- Here document
- Include a file
- Increment a numerical string
- Interactive programming
- Least common multiple
- Loop over multiple arrays simultaneously
- Loops/For
- Loops/For with a specified step
- Loops/Foreach
- Loops/Infinite
- Shell one-liner
- Short-circuit evaluation
- Sieve of Eratosthenes
- Spinning rod animation/Text
- String interpolation (included)
- Terminal control/Dimensions
- Terminal control/Inverse video