基础总结
1)定义变量
- 1、通过set来定义局部变量x,通过$x或者${x}来使用,$%x 表示变量的值的长度,$?x来判断变量x是否设置,如果设置则为1,否则为0
set x = 5
echo $x
echo ${x}kg
echo $%x
-
全局变量的定义setenv v value 该变量将被此shell派生的所有子shell继承。
-
$$表示当前进程的PID, $status 或 $? 表示退出状态。
2)定义数组
- 定义数组myarr, 通过$myarr[index]来访问数组中的值,注意index是从1开始的。通过$myarr或$myarr[*]来访问数组所有的元素。通过$#myarr来查看元素的个数。
- ()中加空格,索引myarr[2]的时候就是一个,不然就是两个
set myarr = (str1, str2,str3)
echo $myarr[2]
echo $myarr
echo $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«WORD 表示将command的输入重定向为从第一个WORD处开始,到下一个WORD处之间的内容(即here文档)。
7)从键盘读取并保存到变量中
set var = $<
8)算术
@ var = 5 + 5
echo $var
@ v2 = $var + 3
echo $v2
9) label 和 goto
csh中没有函数的概念,使用类似windows批处理中的label和goto。
goto label
......
label:
....
10) if/else/switch/case
if(expression)then
commands
endif
if {(command)} then
commands
endif
if(expression) then
commands
else if(expression) then
commands
else
commands
endif
switch("$value")
case pattern1:
commands
breaksw
case pattern2:
commands
breaksw
default:
commands
breaksw
endsw
11)while/foreach
while(expression)
commands
continue
break
end
foreach var (wordlist)
commands
end
12)repeat
repeat表示重复执行后面的命令。
repeat 3 echo "helloworld"
13)csh中设置环境变量PATH的方法
csh中使用path代替PATH,设置类似于数组的使用。
set path = ($path /home)
echo $path
echo $PATH
14)用`可以将一条命令包裹起来
set ret=`pwd`
echo ${ret}
条件语句
cshell 命令语法
1.if / then / else
if (expr) then
commands
else if (expr2) then
commands
else
commands
endif
Example:
#!/bin/csh
if ($#argv == 0) then
echo "No number to classify"
else if ($#argv > 0) then
set number = $argv[1]
if ($number < 0) then
@ class = 0
else if (0 <= $number && $number < 100) then
@ class = 1
else if (100 <= $number && $number < 200) then
@ class = 2
else
@ class = 3
endif
echo The number $number is in class $class
endif
2.foreach / end
-
Syntax:
-
foreach name (wordlist) commands end
-
Example:
-
#!/bin/csh foreach color (red orange yellow green blue) echo $color end
3.while / end
-
Syntax:
-
while (expression) commands end
-
Example:
-
#!/bin/csh set word = "anything" while ($word != "") echo -n "Enter a word to check (Return to exit): " set word = $< if ($word != "") grep $word /usr/share/dict/words end
4.break
-
Syntax:
-
break
-
Example:
-
#!/bin/csh foreach number (one two three exit four) if ($number == exit) then echo reached an exit break endif echo $number end
-
Syntax:
-
continue
-
Example:
-
#!/bin/csh foreach number (one two three exit four) if ($number == exit) then echo reached an exit continue endif echo $number end
5.goto
Goto 语句将控制权转移到以 label 开头的语句:
-
Syntax:
-
goto label
-
Example:
-
#!/bin/csh if ($#argv != 1) goto error1 if ($argv[1] < 6) goto error2 goto OK error1: echo "Invalid - wrong number or no arguments" echo "Quitting" exit 1 error2: echo "Invalid argument - must be greater than 5" echo "Quitting" exit 1 OK: echo "Argument = $argv[1]" exit 1
6.单引号与双引号表示不同的作用
单引号:
-
允许包含空格,
-
防止变量替换,
-
允许生成文件名
双引号:
-
允许包含空格
-
允许变量替换
-
允许生成文件名
-
#!/bin/csh set opt=-l set x1='ls $opt' echo $x1 set x2="ls $opt" echo $x2 Will produce the output: ls $opt ls -l
7.存储命令的输出
-
通过反引号(ESC下面那个)进行特殊命令的存储,并且通过索引进行调用
-
Syntax:
-
set variable = `command`
-
Example:
-
#!/bin/csh set date_fields=`date` echo $date_fields echo $date_fields[1] echo $date_fields[2] foreach field(`date`) echo $field end Sample output: Thu Mar 9 22:25:45 HST 1995 Thu Mar Thu Mar 9 22:25:45 HST 1995
8.读取用户输入
set variable = $<
- or -
set variable = `head -1`
然后就需要用户自己在命令行输入对应的数组
-
#!/bin/csh echo -n Input your value: set input = $< echo You entered: $input - or - #!/bin/csh echo -n Input your value: set input = `head -1` echo You entered: $input
设置一个数组名为ages,赋予变量(0 0 0 0 0)
$ set ages = (0 0 0 0 0)
将ages中的第二个数值定义为15
$ @ ages[2] = 15
将ages中的第三个数值定义为第二个数值加上4
$ @ ages[3] = ( $ages[2] + 4 )
输出这个数组第三个数值
$ echo $ages[3]
输出数组的所有结果
$ echo $ages
c shell 循环语句:If语句
If Example:
#!/bin/csh -f
# Set class depending on argument value
set number = $argv[1]
if ($number < 0) then
@ class = 0 else
if ($number >= 0 && $number < 100) then
@ class = 1
else if ($number >= 100 && $number < 200) then
@ class = 2
else
@ class = 3
endif
echo The number $number is in class $class
c shell 循环语句:switch语句
#!/bin/csh -f
switch (string variable)
case pattern:
commands
breaksw
case pattern:
commands
breaksw
:
default:
commands
breaksw
endsw
c shell 循环语句:while语句
@ limit = $argv[1]
@ index = 1
@ sum = 0
while ($index <= $limit)
@ sum += $index
@ index++
end
echo The sum is $sum
定义一个变量,使用命令:
set var1=a3 #sets var1's value to a3.
set var2=(a b c) # sets the array variable var2 to a b, and c.
通过在变量名前面键入美元符号($)来使用变量。如果变量是一个数组,则可以使用括号[]指定下标,并且可以使用 $# var2格式获取元素的数量
要分配计算值,使用@命令如下:
@var = $a + $x * $z
对比bash&cshell
Bourne shell
#!/bin/sh
i=2
j=1
while [ $j -le 10 ]
do
echo '2 **' $j = $i
i=`expr $i '*' 2`
j=`expr $j + 1`
done
#!/bin/sh
if [ $days -gt 365 ]
then
echo This is over a year.
fi
#!/bin/sh
for i in d*
do
case $i in
d?) echo $i is short ;;
*) echo $i is long ;;
esac
done
C shell
#!/bin/csh
set i = 2
set j = 1
while ( $j <= 10 )
echo '2 **' $j = $i
@ i *= 2
@ j++
end
#!/bin/csh
if ( $days > 365 ) then
echo This is over a year.
endif
#!/bin/csh
foreach i ( d* )
switch ( $i )
case d?:
echo $i is short
breaksw
default:
echo $i is long
endsw
end