Korn Shell(ksh)学习

 

Korn Shell(ksh)学习

Korn Shell

1. 语法

特殊的文件

/etc/profile  在登录时首先自动执行。

$HOME/.profile  在登录时第二个自动执行。

$ENV  在创建一个新的KShell 时指定要读的一个文件。

文件名元字符

匹配有零或零个以上字符的字符串

匹配任何单个字符

[abc…]  匹配括号内任何一个字符,也可用连字符指定一个范围(例如,a-z,A-Z,0-9

[!abc…]  匹配任何不包括在括号内的字符

 

?(pattern)  匹配模式的零个或一个实例

*(pattern)   匹配指定模式的零个或多个实例

(pattern)  匹配指定模式的一个或多个实例

(pattern)  只匹配指定模式的一个实例

(pattern)  匹配任何不匹配模式的字符串

/n  匹配与(…) 中的第n 个子模式匹配的文本。

  当前用户的主目录

name  用户name 的主目录

 

这个模式pattern 可能是由分隔符“| ”或“&”分隔的模式的序列,

例:pr !(*.o|core) | lp

引用

命令分隔符

  后台执行

( )  命令分组

管道

<> &  重定向符号

* ? [ ] ~ + - @ !  文件名元字符

  中间的字符会逐字引用,除了`` 替换命令和$ 替换变量.

‘’  中间的所有字符都会逐字引用

在其后的字符会按其原来的意义逐字采用. 如在”” 中使用 /”,/`,/$

   /a 警告,/b 退格,/f 换页,/n 换行,/r 回车,/ 制表符,/v 垂直制表符,

/nnn 八进制值,/xnn 十六进制值,/’ 单引号,/” 双引号,// 反斜线,

``  命令的替换

变量的替换

命令形式

Cmd &  在后台执行

Cmd1;cmd2  命令序列,依次执行

{cmd1;cmd2;}  将命令做为一组来执行

(cmd1;cmd2)  在子shell 中,将命令做为一组执行

Cmd1|cmd2  管道;cmd1 的输出作为cmd2 的输入

Cmd1 `cmd2`  命令替换;cmd2 的输出作为cmd1 的参数

Cmd1$(cmd2)  命令替换,可以嵌套

Cmd$((expression))  运算替换。用表达式结果作为参数

Cmd1&&cmd2  逻辑与。如果cmd1 成功才执行cmd2

Cmd1||cmd2  逻辑或。如果cmd1 成功则不会执行cmd2

重定向形式

文件描述符:

0         标准输入  stdin  默认为键盘

1         标准输出  stdout

2         标准错误  stderr

 

Cmd > file  cmd 的结果输出到file( 覆盖)

Cmd >> file  cmd 的结果输出到file( 追加)

Cmd < file  file 中获取cmd 的输入

Cmd << text  shell 脚本的内容(直到遇见一个和text 一样的标记为止)作为cmd 的输入

Cmd <> file  在标准输入上打开文件以便读写

 

Cmd >&n  将输出发送到文件描述符nll >&1

Cmd m>&n  将本来输出的m 中的内容转发到n 中。Ll 3>&2

Cmd >&-  关闭标准输出

Cmd <&n  获取输入

Cmd m<&n

Cmd <&-  关闭标准输入

在文件描述符和一个重定向符号间不允许有空格。

 

Cmd 2>file  将标准错误发到file

Cmd > file 2>&1  将标准错误和标准输出都发到file

Cmd > f1 2>f2  将标准输出发到f1, 标准错误发到f2

Cmd | tee files  将输出发送到标准输出和files

Cmd 2>&1 | tee files  将输出和错误同时发到标准输出和files

2. 变量

变量替换

下列表达式中不允许使用空格。冒号是可选的,如果用冒号那么变量必须是非空的并设置了初始值。

Var=value…  将变量var 设为value

${var}  使用变量var 的值; 如果变量和其后面的文本是分开的则可以不加大括号。

${var:-value}  如果变量var 已设置则使用它,否则使用值value

${var:=value}  如果变量var 已设置则使用它,否则使用值value 并将value 赋给变量var

${var:+value}  如果变量var 已设置则使用value ,否则什么也不使用

 

:echo ${u-$d};echo ${tmp-`date`} 如果没设tmp, 则执行date;

内置变量

$#  命令行参数的个数

$?  上一条命令执行后返回的值

$$  当前进程的进程号(PID), 通常用于在shell 脚本中创建临时文件的名称

$0  第一个参数即命令名

$n  命令行上的第n 个参数

$*  将命令行上所有参数作为一个字符串

$@  命令行上所有参数,但每个参数都被引号引起来

 

LINENO  脚本或函数内正在执行的命令的行号

OLDPWD  前一个工作目录(由CD 设置)

PPID   当前SHELL 的父进程的进程号

PWD    当前工作目录(由CD 设置)

RANDOM[=n]  每次引用时产生一个随机数,如果给定n 则以整数n 开始

SECONDS 这个整型变量的值是指从这个shell 会话启动算起所过去的秒数。但它更有用的是用脚本中的计时。

例:start=$SECONDS

    read answer

    finish=$SECONDS

TMOUT   如果设置了该变量,则在没有输入的情况下经过TMOUT 变量所指定的秒数后,shell 退出。值为0 时无效。

CDPATH

允许用户使用简单文件名作为CD 的参数,从而快速改变目录。设置方法与PATH 类似,通常在启动文件中设置。如果CD 的参数是一个绝对路径,则不会查询CDPATH.

例:CDPATH=:/u1/nr:/u1/progs:

    export CDPATH

    cd nr

    就会进到nr 中去。

    注意:变量必须大写,定义后必须导出.

数组

Kshell 支持一维数组,最多支持1024 个元素。第一个元素为0。

Set –A name value0 value1 …

声明数组,指定的值就成为name 的元素。

 

${name[i]}  i01023 的值,可以是表达式。返回数组元素i

${name}  返回数组元素0

${name[*]},${name[@]}  返回所有元素

下标[*][@] 都可以提取整个数组的内容。但当它们在引号中使用时其行为是不同的。使用@ 可生成一个数组,这个数组是原始数组的副本,而使用* ,则生成的仅仅是具有单一元素的数组( 或者是一个普通变量)

例:set -A a "${names[*]}"

    set -A b "${names[@]}" 

    set|head -5

    a[0]='alex helen jenny scott'

    b[0]=alex

    b[1]=helen

    b[2]=jenny

    b[3]=scott

${#name[*]}  返回数组元素个数

运算符

Kshell 使用C 语言中的运算符。

+ ;-  减;! 逻辑非;~ 按进制取反;* ;/ ;% 求余;<< 左移;>> 右移;<= 小于等于;>=  大于等于;< 小于;

> 大于;== 相等;!= 不等;&& 逻辑与;||  逻辑或;

3. 内置命令

#   注释后面的一行

 

Break [n]  for while select until 循环中退出或从n 次循环中退出

 

Case value in

     Pattern1) cmds1;;

     Pattern2) cmds2;;

     …

     …

Esac

类似于select case.:

Case $1 in

   No|yea) response=1

break;;

   -[tT]) table=TRUE;;

   *)  echo “unknown option”;exit 1;;

Esac

 

Continue [n]  for while select until 循环中跳过余下的命令,继续下一次循环( 或跳过n 次循环)

 

Eval args  args 是一行包含shell 变量的代码.eval 首先进行变量扩展,并且运行由此产生的命令。在shell 变量包括了重定向符号,别名或其他变量时是有用的。

:

For option

Do

   Case “$option” in

   Save) out=’ > $newfile’;;

   Show) out=’ | more’;;

Esac

Done

Eval sort $file $out

 

Exit [n]  退出脚本,退出状态为n.

 

Export [name=[value]…]

定义全局变量,让其它shell 脚本也可以使用。无参数时输出当前定义的全局变量。

 

For x [in list]

Do

   Commands

Done

使变量x( 在可选的值列表中) 执行commands ,省略时假定为”$@” 位置参数

:

For item in `cat program_list`

Do

   Grep –c “$item.[co]” chap*

Done

 

Function name{commands;}  定义一个函数

 

If condition1

Then commands1

[elif condition2

Then commands2]

[else commands3]

Fi

条件执行语句。

 

Let expressions  执行一个或多个表达式。表达式中的变量前不必有$. 如果表达式中包含了空格或其他特殊字符,则必须引起来。

例:let “I = I + 1” let i=i+1

 

Read [var1[?string]] [var2 …]  从标准输入读入一行给相应的变量,并把剩余的单词给最后一个变量。String 为相应的提示信息. 无参时只等待一次输入。

 

Readonly [var1[=value] var2[=value] …]  设置只读变量, 无参时显示所有只读变量

 

Return [n]  用于一个函数里面返回状态

 

repeat word

do

    commands

done

指定一个命令序列执行的次数。

例:

repeat 3

do

echo "bye"

done

 

Select x [in list]

Do

   Commands

Done

显示一列按list 中顺序编号的菜单项。让用户键入行号选择或按return 重新显示。

:

Ps3=”select thd item number:”

Select event in format page view exit

Do

   Case “event” in

      Format) nroff $file | lp;;

      Page) pr $file | lp;;

      View) more $file;;

      Exit) exit 0;;

      *)    echo “invalid selection”;;

   Esac

Done

输出为:

1.     format

2.     page

3.     view

4.     exit

select the item number:

 

set [options arg1 arg2 …]  无参时输出所有已知变量的值。

 

Shift [n]  交换位置参数(如将$2 变为$1. 如果给出n, 则向左移动n 个位置。通常用于在while 循环中迭代命令行参数。N 可以是一个整数表达式。

 

Sleep [n]  睡眠n 秒钟

 

Test condition [ condition ]  判断条件,为真返回0, 否则返回非0.

文件:

-a filename         如果该文件存在而为真

-d filename         如果该文件存在且为一个目录,则为真

-f filename         如果该文件存在且为一个常规文件,则为真

-L filename         如果该文件存在且为一个符号链接,为真

-r filename         如果该文件存在且用户对其有读取权限,真

-s filename         如果该文件存在且包含信息( 大于0 字节) ,真

-w filename         如果该文件存在且对其有写入权,真

-x filename         如果该文件存在且对其有执行权,真

File1 -nt file2     如果file1 存在且在file2 后修改则值为真( 指修改时间)

File1 -ot file2     如果file1 存在且在file2 前修改则值为真( 指修改时间)

字符串:

string          如果string 不为空字符串则值为真

-n string       如果string 字符长度大于0 则值为真

-z string       如果string 字符长度等于0 则值为真

string1=sting2      如果string1 等于string2 则值为真

string1!=string2        如果string1 不等于string2 则值为真

string2 可以是通配符模式。

整数比较:

-gt 大于;-ge 大于或等于;-eq 等于;-ne 不等于; -le 小于或等于; -lt 小于

组合:

! condition                         如果condition 为假则为真

condition1 –a condition2           如果两个条件都为真则为真           

condition1 –o condition2           如果两个条件有一个为真则为真

 

trap [[commands] signals]  如果接收到任何的信号signals 则执行命令commands. 如果完全忽略commands 则会重新设置由默认行为处理指定的信号。

例:

Trap “” 2 ; 忽略信号2 (中断,通常是ctrl+c

Trap 2 ; 恢复中断2

Trap “rm –f $tmp;exit” 0 1 2 15 ;shell 程序退出,用户退出,按ctrl+c 或执行kill 时删除$tmp.

 

Typeset [options] [var [var]…] 设置变量属性

-u 将变量值中所有字母全部转换成大写

-l 将变量值中所有字母全部转换成小写

-i 将变量值设为整数类型.-ix x 为相应的进制,表示时为x# 变量值,可用于进制转换。

    例:typeset -i2 vv  vv=2    echo $vv    2#10

    typeset -i 相当于integer

-L width width 宽度之内左对齐

-R width width 宽度之内右对齐,前面空位用空格填充

-Z width width 宽度之内右对齐,变量如果是数字,则前面空位用零填充

如果忽略width, 将使用赋给这个变量的第一个值的宽度。

-x 设置一个变量全局。typeset -x 相当于 export

-r 设置一个变量具有只读属性,在设置的同时或之前,要先给这些变量赋值。

例:typeset -r  PATH FPATH=/usr/local/funcs

typeset -r 相当于 readonly

不带参数的typeset 可以列出变量和变量的属性。查看指定的变量属性可用type|grep day

使用带有某一选项的typeset 来看看哪一个变量具有特定的属性:typeset -z

 

Unset var  删除一个变量,将它置为空

 

Until condition

Do

   Commands

Done

执行命令command 直到满足条件condition.

 

While condition

Do

   Commands

Done

如果满足条件condition 则执行commands

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值