csh(读作C Shell),是UNIX上的 命令解释程序,执行 读入命令、解释、直到执行。
Shell 程序是 由 Shell 解释的 命令的集合。组合这种命令,可以作成持有多种功能的 新命令。C Shell的动作如下。
△简单的 Shell 编程
#! /bin/csh
……
……
如果 在脚本 第一行写 #!/bin/csh -f ,则不读入~/.cshrc。如果不带 -f 选项,则在脚本里,~/.cshrc中定义的设定(alias等)变为有效。
if(条件) then
命令(任意的行数可)
else if (条件) then
命令(任意的行数可)
else
命令(任意的行数可)
endif
例
#! /bin/csh
if ($#argv != 1) then
echo "a file name should be specified as an argument"
exit
endif
if ((-r ${1}.tex) && (-f ${1}.tex)) then
jlatex $1
else
echo "file ${1}.tex is not a readable file"
exit
endif
rm ${1}.log ${1}.aux
if (!(-z ${1}.dvi)) then
xdvi $1
else
echo "file ${1}.dvi is empty"
endif
并且,文件表达式 如下所示
-d:目录
-f:普通的 文件
-r:可读
-w:可写
-x:可执行
-e:文件的存在与否
-o:所有权
-z:文件大小是否为0
这些表达式 调查 文件的状态,真则值为1,假则值为0
foreach 变量名(参数1 参数2 …… 参数N)
命令1
命令2
·
·
命令N
end
例(在最后 如果没有换行,则不循环)
#! /bin/csh
foreach f (a.tex b.tex c.tex)
echo compiling a TeX file $f
jlatex $f
end <RET>
while(条件表达式)
命令1
命令2
·
·
命令N
end
例子(在最后 如果没有换行,则不循环)
set n=1
while ( $n <= 10 )
echo $n
@ n = $n + 1
end <RET>
C Shell的 运算符
history:h 除掉 路径名的 最后的 部分,取出其余路径名
history:t 仅仅取出路径名的 最后的 部分
history:r 除掉 扩展名
history:e 仅仅 取出 扩展名
history:s/l/r/ 把字符串 l 变换为 r
history:q 把字符串 括起来
history:x 把字符串 以空白、TAB作为分隔,然后括起来
history:g 对所有的句 修饰
history:a 对所有的字符 修饰
history:& 上回的 置换 再进行一次
history:p 不是执行命令,而是仅仅表示
不管哪个 history, 都可以包含 参数指定。
例:把多张图片 一次 转换为 bmp格式(于mogrify相同),变更为 从100开始的 文件名
$ ./img2bmp *.gif
例:img2bmp的 源代码(在最后,如果没有换行,则不循环)
#!/bin/csh
set l = 100
foreach a ($*)
convert $a $l:r.bmp
@ l ++
end <RET>
不使用C Shell,从文件名 除掉 路径和扩展名
$ basename /home/hoge/file1.txt.txt ← 在末尾 指定 待除掉的扩展名
file1
不使用C Shell,仅仅除掉 路径名的 最后的部分
$ dirname /home/hogei/file1.txt
/home/hogei/
特别的 变量
$0 启动Shell时的 命令名
$< 从 标准输入(stdin)读入1行,返回其值
$$ 对该变量求值的 csh进程番号
$! 最后 在后台 执行的 进程的 进程番号
而且,C Shell 不能进行 实数的处理。请利用Perl等。
重定向(Redirect)(但是csh的场合下,取决于 noclobber 的 设定)
操作 |
sh系 |
csh系(csh,tcsh等) |
stdout的重定向 |
> file |
> file |
stdout的追加重定向 |
>> file |
>> file |
stderr的重定向 |
2> file |
无法仅仅取出stderr |
stderr的追加重定向 |
2>> file |
无法仅仅取出stderr |
stdout和stderr的重定向 |
> file 2>&1 |
>& file |
stdout和stderr的追加重定向 |
>> file 2>&1 |
>>& file |
通过管道把stdout和stderr向命令重定向 |
2>&1 | command |
|& command |
把stdout和stderr向各自的文件重定向 |
> file1 2> file2 |
例:(command > file1) >& file2 |
注意:上表中的 | , 实际上请使用半角的竖线 | 。这里只是为了排版方便。
假如是sh系
$ find / -name hoge 2>/dev/null
假如是csh系
$ find / -name hoge |& grep -v "find:"