linux 重定向到 数组中,Cshell的基本语法和基础知识

本文介绍了Cshell的基本概念及其在Linux环境下的使用方法,包括变量定义、数组操作、命令替换等内容,并详细讲解了Cshell的语法特点及常用命令。

shell简介

在*unix系统中,常用的shell有bash, sh, csh/tcsh, ksh.等。

Linux 操作系统缺省的shell 是Bourne

Again shell,它是Bourne shell的扩展,简称Bash ,与Bourne shell完全向后兼容,并且在Bourne

shell的基础上增加、增强了很多特性。Bash

放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多C shell 和Korn

shell 中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。

C shell是一种比Bourne shell更适于编程的shell ,它的语法与C 语言很相似。 Linux 为喜欢使用C

shell的人提供了Tcsh 。Tcsh 是C shell的一个扩展版本。Tcsh

包括命令行编辑、可编程单词补全、拼写校正、历史命令替换、作业控制和类似C 语言的语法,它不仅和Bash

shell是提示符兼容,而且还提供比Bash shell更多的提示符参数。

Korn shell集合了C shell和Bourne shell的优点并且和Bourne shell完全兼容。Linux

系统提供了pdksh (ksh 的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。

Linux 并没有冷落其他shell

用户,还包括了一些流行的shell 如ash 、zsh 等。每个shell 都有它的用途,有些shell

是有专利的,有些能从Internet 网上或其他来源获得。要决定使用哪个shell ,只需读一下各种shell

的联机帮助,并试用一下。

执行Cshell脚本

当你执行一个shell script时, 系统会检查script文件的第一行以确定如何执行其中的命令:

○ 如果第一行以#!开始, 后面跟着一个程序名,

系统就会用那个程序来执行script中后面的命令.

○ 如果第一行以#开始,

系统会用Cshell执行script.等同于#!/bin/csh

○ 如果第一行不是以#开始,

系统就会用Bshell来执行script.等同于#!/bin/sh

[建议您使用明确的写法,即用#!/bin/csh(sh)]

如果你想快速执行Cshell, 即不想读入Cshell的启动程序(.cshrc等),

在script文件的第一行应该用类似下面的格式:

#!/bin/csh -f

​SCRIPT中的参数及变量

如何将命令行的参数传给script呢? 可以这样: 键入script名, 后面跟任何你想要传递的参数.

Cshell把script名后面的字符按照词(words)来划分后传递给一个叫做argv的变量数组, 叫做arguments

list. 这样命令行的参数就作为words存储于argv中, 连同script名, 分别可以被引用为argv[0],

argv[1], ... argv[n], 或者你也可以用等效的方法即$0,$1,...,$n来引用它们,其中n是参数的个数.

Cshell基本语法

1) 变量

通过set来定义局部变量x,通过$x或${x}来使用变量x的值,$%x表示变量的值的长度,

$?x来判断变量x是否设置,如设置则为1,否则为0。

set x =

5

echo $x

#​echo

${x},echo $%x

全局变量的定义setenv

v  value

该变量将被此shell派生的所有子shell继承。

$$表示当前进程的PID, $status 或 $? 表示退出状态。

2)数组

定义数组myarr,

通过$myarr[index]来访问数组中的值,注意index是从1开始的。通过$myarr或$myarr[*]来访问数组所有的元素。通过$#myarr来查看元素的个数。

set myarr = (str1, str2,str3)

​echo

$myarr[2]

#echo

$myarrecho

$myarr[*]

​3)命令替换

通过set x = `cmd`来执行命令,且结果赋值给变量。

set d = `date`

​echo

$d   # echo

$d[6]-$d[2]-$d[3]

4)命令行参数

通过$argv[1],$argv[2]或$1,$2来访问命令行参数。命令行参数的个数为$#argv。

5)文件名扩展的元字符

只能使用?,*,[abc],[a-c]。

6)IO重定向和管道

将命令的输出重定向到文件为>。

将命令的输出重定向并追加到文件为>>。

将命令的输入重定向到文件为

将命令的报错信息重定向到一个文件(cmd>/dev/tty)>&errors。

将命令的输出和错误输出分别重定向(cmd >

goodstuff)  >&

badstuff。

将命令的输出和报错信息重定向到一个文件cmd>&file。

将命令的输出经管道发往另一个命令cmd|cmd.

将命令的输出和报错信息经管道发往另一个命令cmd|&cmd。

条件语句为 cmd && cmd 或 cmd

|| cmd。

command<

表示将command的输入重定向为从第一个WORD处开始,到下一个WORD处之间的内容(即here文档)。

7)从键盘读取并保存到变量中

set var =

$<

8)算术

@ var = 5 + 5

​echo

$var

​@ v2 =

$var + 3

​echo

$v2

9)代字符号扩展

~username 表示username的home目录。

10)别名

alias m more 为more创建别名m。

alias 列出所有的alias。

unalias m 用来删除more的alias定义。

11)初始化文件

.login 在登录时执行的文件。.cshrc 在每次调用shell时都执行的文件。

12) label 和 goto

csh中没有函数的概念,使用类似windows批处理中的label和goto。

goto label

​......

​label:

​....

13)

if/else/switch/case

if(xxx)then

commands

endif

if(xxx)

then

commands

else if(xxx) then

commands

else

commands

endif

switch("$value")

case pattern1:

commands

breaksw

case pattern2:

commands

breaksw

default:

commands

breaksw

endsw

14 while/foreach

while(xxx)

commands

continue

break

end

foreach var (wordlist)

commands

end

15、repeat

repeat表示重复执行后面的命令。

repeat 3 "echo helloworld"

16、csh中设置环境变量PATH的方法

csh中使用path代替PATH,设置类似于数组的使用。

set path = ($path /home)

echo $path

#echo

$PATH

17、source等价于其他shell中的内容.

source使得程序在当前的shell中被执行,而不是派生子进程来执行。

18、转义字符与单双引号

引号必须成对出现,而且必须在同一行上配对。可以用反斜杠来转义换行符,这样就能在下一行配对了。

单引号可用于保护双引号,双引号也可以用来保护单引号。

单引号保护除历史字符(!)之外的所有元字符不被解释。

双引号保护除历史字符(!),变量替换字符($)和反引号(用于命令替换)之外的所有元字符,使其不被解释。

19、历史command

history用来查看command执行的历史。

!!用来执行上一条命令。

20、pushd和popd用来维护目录栈

21、csh

-vx用来显示输入的原样和变量替换后的脚本,用来帮助调试。

22、在脚本中处理中断

onintr finish

finish:

onintr - # Disable further interrupts

echo Cleaning temp files

exit 1

onintr

命令后跟一个标号名,finish是用户自定义的标号。如果发生中断,控制将被转移到finish标号。通常该行位于脚本的开头。除非当程序正在执行时按ctrl+C(中断键),此时控制将被转移到该标号。onintr

-

表示屏蔽所有的中断,此时按下ctrl+C将会被忽略。

23、noclobber

禁止覆盖变量,设定

$noclobber

预设变量改变输出重定向特性.

变量设定语法set noclobber

取消变量设定语法unset noclobber

这个 noclobber

变量,它的功能便是停止重定向符号“>”的覆盖(overwiting)已存在文件以及符号“>>”要将字符写入一个不存在的文件时,自动产生该文件的特性。

24)文件操作格式

-操作符 filename

-e 文件存在返回1(.true.), 否则返回0(.false.).

-r 文件可读返回1,否则返回0.

-w ....可写................

-x ....可执行...............

-o 文件属于用户本人返回1, 否则返回0.

-z 文件长度为0返回1, 否则返回0.

-f 文件为普通(plain)文件返回1, 否则返回0.

-d 文件为目录文件时返回1, 否则返回0

25) 路径名操作

你可以对路径名进行操作, 以便于去掉你不需要的部分.

:t (tail)只保留路径名最右边的部分, 而将前面的全部去掉. (相当于basename)

:r (root)去掉从"."(dot)开始的后缀部分.

:e (end)去掉从左边开始一直的"."的前缀部分.

:h (head)去掉最后的一部分, 只保留文件所在的目录名.

​​

Reference: http://www.jb51.net/article/57770.htm

Reference:  http://blog.youkuaiyun.com/augusdi/article/details/40018377

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值