Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

linux shell编程入门知识

来源: 未知 分享至:

一、Shell语法
1.1、变量声明

  • 1.2、数组声明和使用1.3、特殊的变量
    1.4、运算和运算符
  • 1.4.1、整数运算符
  • 1.5、流程语句
    1.5.1、if 语句
  • 1.5.2、case语句
  • 1.5.3、select 语句
    1.6、循环语句
    1.6.1、for语句

    1.6.2、while 语句
    1.6.3、breake 和continue
    1.6.4、shift三、shell程序调试
    四、信号
    五、bash中常用的命令


 

SHELL编程


一、Shell语法
1.1、变量声明

变量=值 (注意:等号两侧不能有空格)
a=”hello”
b=9
unset a 撤销变量 a
readonly a=2 声明静态的变量 a=2 ,不能 unset
export 变量名 可把变量提升为全局环境变量,可供其他shell程序使用

变量应用中要注意:
echo $1 = $1 ; $2 = $2 ; 屏蔽$1 ,屏蔽 $2 ,直接显示 $1 ,$2,同理*也屏蔽了 * 的通配符作用
${SAT}day ,变量要与字符串连在一起时,应该用 ${}
a= `ls -al` 反引号,运行里面的命令,并把结果返回给变量a
a=$(ls -al) 等价于反引号
单引号‘’和双引号“”的区别,单引号完全屏蔽 $a 变量,双引号不屏蔽$a,单引号和双引号都屏蔽 * 的通配符作用。


1.2、数组声明和使用name[0]=Tom
name[1]=Tomy
name[2]=John

name=(Tom Tomy John)

例子:
#!/bin/bash
name=(Tom Tomy John)
for i in 0 1 2
do
echo $i:${name[$i]}

 

1.3、特殊的变量
$0:脚本名字。此变量包含地址,可以使用basename $0获得脚本名称。
$1:第一个参数
$2,$3,$4,$5,...一次类推。
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数,,以($1 $2...)
$$ 脚本运行的ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。($1$2...)
$- 显示shell使用的当前选项。
$? 显示最后命令的推出状况。0表示没有错误。

例子:
#!/bin/sh
if [ $# -ne 2 ] ; then
echo Usage: $0 string file;
exit 1;
fi
grep $1 $2 ;
if [ $? -ne 0 ] ; then
echo Not Found $1 in $2;
exit 1;
fi
echo Found $1 in $2;

上面的例子中使用了$0 $1 $2 $# $? 等变量,下面是程序的解释:
判断运行参数个数,如果不等于2,显示使用用法帮助, 其中 $0 表示就是脚本自己。
用grep 在$2 文件中查找$1 字符串。
判断前一个命令运行后的返回值(一般成功都会返回0, 失败都会返回非0)。
如果没有成功显示没找到相关信息,否则显示找到了。
其中表示转义,在 里面还需要显示号,则需要加上转义符

参数置换的变量
1、变量=${参数:-word}:如果设置了参数,则用参数的值置换变量的值,否则用word置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值。
[ -z ${COLUMNS:-} ] && COLUMNS=80
2、变量=${参数:=word}:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成word,然后再用word替换参数的值。注意,位置参数不能用于这种方式,因为在Shell程序中不能为位置参数赋值。
3、变量=${参数:?word}:如果设置了参数,则用参数的值置换变量的值,否则就显示word并从Shell中退出,如果省略了word,则显示标准信息。这种变量要求一定等于某一个参数的值。如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。
4、变量=${参数:+word}:如果设置了参数,则用word置换变量,否则不进行置换。

字符串匹配的操作:


${PARAMETER#WORD} shell 像文件名扩展中那样扩展 WORD,并从 PARAMETER 扩展后的值的开头删除最短的匹配模式(若存在匹配模式的话)。使用 ‘@’ 或 ‘$’ 即可删除列表中每个参数的模式。
${PARAMETER##WORD} 导致从开头删除最长的匹配模式而不是最短的匹配模式。
${PARAMETER%WORD} shell 像文件名扩展中那样扩展 WORD,并从 PARAMETER 扩展后的值末尾删除最短的匹配模式(若存在匹配模式的话)。使用 ‘@’ 或 ‘$’ 即可删除列表中每个参数的模式。
${PARAMETER%%WORD} 导致从末尾删除最长的匹配模式而不是最短的匹配模式。
${PARAMETER/PATTERN/STRING} shell 像文件名扩展中那样扩展 PATTERN,并替换 PARAMETER 扩展后的值中最长的匹配模式(若存在匹配模式的话)。为了在 PARAMETER 扩展后的值开头匹配模式,可以给 PATTERN 附上前缀 #,如果要在值末尾匹配模式,则附上前缀 %。如果 STRING 为空,则末尾的 / 可能被忽略,匹配将被删除。使用 ‘@’ 或 ‘$’ 即可对列表中的每个参数进行模式替换。
${PARAMETER//PATTERN/STRING} 对所有的匹配(而不只是第一个匹配)执行替换。
 

變數設定方式 str 沒有設定 str 為空字串 str 已設定非為空字串
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
var=${str+expr} var= var=expr var=expr
var=${str:+expr} var= var= var=expr
var=${str=expr} str=expr
var=expr str 不變
var= str 不變
var=$str
var=${str:=expr} str=expr
var=expr str=expr
var=expr str 不變
var=$str
var=${str?expr} expr 輸出至 stderr var= var=str
var=${str:?expr} expr 輸出至 stderr expr 輸出至 stderr var=str

 


[ian@pinguino ~]$ x=a1 b1 c2 d2
[ian@pinguino ~]$ echo ${x#*1}
b1 c2 d2
[ian@pinguino ~]$ echo ${x##*1}
c2 d2
[ian@pinguino ~]$ echo ${x%1*}
a1 b
[ian@pinguino ~]$ echo ${x%%1*}
a
[ian@pinguino ~]$ echo ${x/1/3}
a3 b1 c2 d2
[ian@pinguino ~]$ echo ${x//1/3}
a3 b3 c2 d2
[ian@pinguino ~]$ echo ${x//?1/z3}
z3 z3 c2 d2

字符串子集提取:
${x:3:5}
的值就是 “e val”,
清单 9. shell 参数值的子字符串

[ian@pinguino ~]$ x=some value
[ian@pinguino ~]$ echo ${x:3:5}
e val

字符串长度:
您已经知道 $# 表示参数的数量,而 ${PARAMETER:OFFSET:LENGTH} 扩展适用于单个参数以及 $* 和 $@,因此,可以使用一个类似的结构体 ${#PARAMETER} 来确定单个参数的长度也就不足为奇了。清单 10 中所示的简单的 testlength 函数阐明了这一点。自己去尝试使用它吧。
清单 10. 参数长度
[ian@pinguino ~]$ testlength () { for p in $@; do echo ${#p};done }
[ian@pinguino ~]$ testlength 1 abc def ghi
1
3
7

1.4、运算和运算符

1.4.1、整数运算符

整数的算术运算符
+ - * / %
赋值运算符
+= -= * = / = %=
位运算符
<< >> & | ~ ^
位运算赋值运算符
<< = >> = & = | = ~ = ^ =
逻辑运算符:
&& || ! > > = < < = != ==

expr命令计算一个表达式的值
格式 :expr arg
例子:
计算(2 +3 )×4 的值
1 、分步计算,即先计算2 +3 ,再对其和乘4
s=`expr 2 + 3`
expr $s * 4
2 、一步完成计算:
expr `expr 2 + 3 ` * 4
说明:
运算符号和参数之间要有空格分开;
通配符号(* ), 在作为乘法运算符时要用 、“” 、‘’ 符号修饰

关键字let计算表达式的值:
#!/bin/bash
x=2006
let x = $x + 1
echo $x
x=a string.
echo $x

又出现了新的关键字:let。关于整数变量计算,有如下几种: + - * / % ,他们的意思和字面意思相同,在*和/之前必须冠以反斜线,已防被SHELL先行解释。整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let x = $x + 1 或者 x=`expr $x + 1`

 

1.4.2、逻辑运算符

对应操作 整数 字符串
相同 -eq =
不同 -ne !=
大于 -gt >
小于 -lt <
大于或等于 -ge
小于或等于 -le
为空 -z
不为空 -n

文件操作逻辑运算符:
-d file ----当file是一个目录时,返回 True
-f file ----当file是一个普通文件时,返回 True
-r file ----当file是一个只读文件时,返回 True
-s file ----当file文件长度大于0时,返回 True
-w file ----当file是一个可写文件时,返回 True
-x /bin/ls ----当/bin/ls是一个可执行文件时,返回 True,目录是否可访问
-e file ----当file存在时,返回True
-o file ----当file文件的所有者是当前用户时,返回True
-z file ----当file长度为0时,返回True
-u -----文件的 UID 标志被设置
-G -----文件的组 ID 和当前用户相同
file1 -nt file2 -----文件 file1 比 file2 更新
file1 -ot file2 -----文件 file1 比 file2 更老


逻辑连接符:
! expr 当expr的值是False时,返回True
Expr1 -a expr2 当expr1,expr2值同为True时,返回True
Expr1 -o expr2 当expr1,expr2的值至少有一个为True时,返回True

命令逻辑连接符:
[ -r $mailfolder ]||{ echo Can not read $mailfolder ; exit 1; }
使用{}把两个命令括起来,表示一个函数的用法。 && 与 ||或
[ -f /etc/shadow ] && echo This computer uses shadow passwors
注意:在“[”和“]”符号的左右都留有空格

例子:
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r $mailfolder ]||{ echo Can not read $mailfolder ; exit 1; }
echo $mailfolder has mail from:
grep ^From $mailfolder
其中 “^From“ 表示以 From 开头的


1.5、流程语句
1.5.1、if 语句

if [ 逻辑表达式 ]; then
 #command code
elif [ 逻辑表达式 ]; then
 #commandcode
else
  #commandcode
fi

if [ expression ]
then
#code block
elif [ expression ]
then
#code block
else
#code block
fi
如果您为了简洁,想把 then 和 if 放在一行,那就要这样写了:if [ expression ]; then。即在 then 前加一个“;”号。


Tags: SHELL编程
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史