csh(读作C Shell),是UNIX上的 命令解释程序,执行 读入命令、解释、直到执行。

Shell 程序是 由 Shell 解释的 命令的集合。组合这种命令,可以作成持有多种功能的 新命令。C Shell的动作如下。

[b]△简单的 Shell 编程[/b]

#! /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



[b]并且,文件表达式 如下所示[/b]


-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/




[b]特别的 变量[/b]


$0 启动Shell时的 命令名


$< 从 标准输入(stdin)读入1行,返回其值


$$ 对该变量求值的 csh进程番号


$! 最后 在后台 执行的 进程的 进程番号



而且,C Shell 不能进行 实数的处理。请利用Perl等。



重定向(Redirect)(但是csh的场合下,取决于 noclobber 的 设定)


[table]


|操作|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|


[/table]



注意:上表中的 | , 实际上请使用半角的竖线 | 。这里只是为了排版方便。


假如是sh系


$ find / -name hoge 2>/dev/null




假如是csh系


$ find / -name hoge |& grep -v "find:"