`

csh讲座

    博客分类:
  • Bash
阅读更多
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:"
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics