一、学习shell的意义
1、什么是shell
Shell——是介于用户与系统之间,帮助用户与系统进行沟通的工具。除了文字模式的 shell 外,GNOME、KDE 这类图形界面也属于 shell 的范畴。我们通常提到 shell 时都是指狭义的 shell,即文字模式的 shell。
2、Linux中有哪些shell
一般来说,shell 可以分成两类。第一类是由 Bourneshell 衍生出来的包括sh,ksh,bash,与 zsh。第二类是由 Cshell 衍生出来的,包括 csh 与 tcsh。 除此之外还有一个rc。
3、为什么要学习 shell
1. 图形用户界面——只是一个程序套件,文字模式的 shell 功能和能执行的任务则比图形界面要强得多。
2. shell 是文字模式,因此远程登录和传输的速度比图形界面更快
3. shell 使用更方便。在图形界面需要打开许多窗口执行许多次点击的任务,使用 shell 也许只需要简单几个命令就能完成了。
举例:
(1) 查看一个文件或目录的大小 ls du
(2) 定时执行一个任务 crontab -e
4、如何写一个简单的bash shell
1) 可以使用任何文本编辑工具编写,如:vim
#!/bin/bash #放置在文件的开头
2) 设置脚本执行权限
chmod a+x filename
chmod 700 filename
3) 执行脚本
bash your_script.sh
sh your_script.sh
./your_script.sh
二、SHELL中的变量
1. 变量的分类
1.1.系统环境变量
系统本身所有,通常为大写字母
系统变量通过set或declare指令进行查看
1.2.UDV 变量(user defined variable)
用户创建和维护,建议大写(为什么?)
原因:
避免冲突与混淆,因为Linux系统中命令全部采用小写的方式
2. 变量的属性和定义
2.1.变量的属性
1) Shell中所有变量定义都为字符串。
2) 变量区分大小写,如:foo和Foo是两个不同的变量
3) 变量必须以字母或下划线开头,不得有”,”,”:”,”\”等
特殊字符。
3. 变量的声明
3.1) 变量的定义
变量名=值 (变量名与值之间”=”号没有空格)
举例:LANG=cn 与LAGN= en LANG =en
3.2) 声明带空格变量
需要加上引号——” ”
举例:MY=23 67
3.3) 声明一个只读变量
readonly MY_UDV=guozi
3.4) 修改变量
修改环境变量 例:PATH=$PATH:/opt/bin
修改用户自定义变量 例:SRC=”guozi”
4. 变量的使用
变量前加“$”符号
echo $HOME 或echo ${HOME}
echo $USER或echo ${USER}
三、SHELL中的重定向和管道
1. 什么叫重定向
将输入或输出重新指定到别的位置。
2. 重定向输出
2.1.命令执行数据流
文件/设备---- 标准输入 -->命令 --- 标准输出 -->文件/设备
|
标准错误
?
文件/设备
直接输入:ls –l > lsoutput.txt
追加:ls –l /home >> lsoutput.txt
输出到空设备:/dev/null
“>” 代表重定向到哪里
“1” 表示stdout标准输出,系统默认值是1
">/dev/null"等同于"1>/dev/null"
“2” 表示stderr标准错误
“&” 表示等同于的意思,2>&1,表示2的输出重定向等同于1
举例:killall ser > /dev/null 2>&1
3. 重定向输入
3.1.shell终端中交互式输入内容
格式:cat >> 2.txt <<EOF [内容] EOF
3.2.从一个文件中读取内容赋值给一个变量
格式:read variable < filename
4. 管道
管道好比自来水管,从前往后流!
举例:
1) 将指定文件夹内的文件按文件大小从小到大排列。 ls <directory> | sort
2) 查看mysql进程是否存在 netstat | grep ‘mysql‘
3) 查询一个软件包(rpm)的安装信息 rpm -qa 软件包 | less
4) 利用管道和重定向将查询到的软件安装信息输出到指定文件 rpm -qa 软件包 | less >1.txt
四、echo命令
1. 显示文本或变量值
格式:echo [选项][字符,变量……]
选项:
-n 不换行输出 echo默认是输出一次换一行
-e 增强。启用转义字符解析
\a 响铃 \b 退格 \c 去除尾部的新行
\n 新的一行 \r 回车 \t 水平制表符
\\ 斜杠 \0NNN 八进制 \0xHH 十六进制输出
举例: echo -e “ Welcome to GuoZi’ s \n\t\\ shell programming”
2. 输出有颜色的字符
前景色:十位数的3表示 范围:30-37(3x表示)
背景色:十位数的4表示 范围:40-47(4x表示)
个位数表示色彩
30(黑色)
31(红色) 32(绿色) 33(黄色)
34(蓝色)
35(洋红) 36(青色) 37(白色)
举例:echo -e "Network restarting... [\033[32;40m OK \033[0m]"
3. echo的实际应用
写一个脚本:提示用户输入一个密码,并把密码进行base64或
md5加密,然后将加密后的密码保存到/root/secrets文件中
步骤:
1、提示输入密码;
2、对密码加密;
3、重定向输入到文件;
4、查看密码。
五、shell中的数学计算
1. 计算方法
有三种格式可以进行数学计算。
1.1.第一种——expr
格式:expr 操作数1 操作符 操作数2
举例:
1 expr 1 + 2 TMP=$(expr 1 + 2)
2 expr 1 + 4 / 3 TMP=$(expr 1 + 4 / 3 )
3 expr 1 + 2 * 3(?)
特点:格式要求相对严格
1.2.第二种——( )
格式:$((操作数1 操作符 操作数2 ))
举例:TMP=$((1 + 3))
特点:格式要求相对较松
1.3.第三种——let
格式:let “[变量] [操作符] 操作数1 操作符 操作数2”
举例:
1 let “1+2”
2 let “TMP2=1+2”
特点:格式要求松,计算灵活
2. 数学计算的实际用途
写一个简单的脚本:
当/tmp目录下文件占用率达到80%时, 对磁盘文件进行特定的清
理,当达到设定值时对管理员发一封邮件报警,要求每天检查一次。
步骤:
1、使用df命令对/tmp目录进行查看;
2、对磁盘占用率进行计算
3、判断是否达到特定值
4、根据第3步结果决定报警
5、将脚本加入到定期执行计划中
六、shell中的引用
1. 什么叫引用
对shell脚本、程序、终端命令、变量、字符串等结果的反馈。
2. 引用的类型
" " 双引号 ` 反引号
‘ ‘ 单引号 \ 反斜线
3. 引用的必要性
目的:防止不必要的误会。
举例:
1 echo hello world * 与 echo “hello world *”
2 echo “hello ‘ world “ welcome”
3 echo “hello \ world”
3.1. 双引号
使用双引号可引用除字符 $、`、\ 外的任意字符或字符串。
举例:
1 echo “Welcome to #$%^ to Shell programming”
2 echo “Welcome to $ABC programming”
3.2. 单引号
单引号与双引号类似,不同的是 shell 会忽略任何引用值。
举例:
echo “The ‘$BOY’ is 24 years old”
3.3. 反引号
反引号用于将系统命令的输出到变量,举例:
1 echo `hello` (错×)
2 echo `date` (对√)
3.4. 反斜线
如果下一个字符有特殊含义,反斜线防止 shell误解其含义。下述字符包含有特殊意义: & * + ^ $ ` " | ?。
4. 小结
我在使用引用时遵循两条规则:
1) 输出字符串用双引号,但不要引用双引号本身。
2) 如果使用引用得到的结果不理想,再试另一种,毕竟只有三种引用方式,可以充分尝试。
七、文件名匹配
学习目的
? 匹配文件名中的任何字符串。
? 匹配文件名中的单个字符。
? 匹配文件名中的字母或数字字符。
1. 匹配文件的符号
定义:匹配字符串类型的符号称之为元字符。
1.1. * 匹配文件
* 匹配文件名中的任何字符串,包括空字符串。
举例:ls /etc/*.conf
ls /etc/cg*.co*f
1.2. ? 匹配文件
? 匹配文件名中的任何单个字符。
举例:
ls /etc/pptp?.conf
ls /etc/??st.conf
1.3.[ ] 匹配文件
[...] 匹配 [ ] 中所包含的任何一个字符。
杂乱匹配:ls /etc/[wersdfp]syslog.conf
范围匹配:ls [0-9][a-zA-Z].txt
[!...] 匹配 [ ] 中非感叹号!之后的任意一个字符与上一条规则刚好相反。
举例:ls [!0-9]*.txt
匹配非数字开头的后缀名为txt的所有文件。
2. 综合应用
查找一个以数字开头,接着包括两个小写英文字母,然后再接任
意两个字符的以.conf结尾的文件名。 (如:5abcui.conf是符合条件
的。
八、命令执行的顺序和结果
学习目标
? 命令执行后的返回值。
? 命令执行的控制。
? 命令执行的组合。
1. 命令的执行结果
成功:返回0
失败:返回非0
2. 命令执行控制
2.1.使用&&符号
格式:命令1 && 命令2 && …
说明:如果命令1执行成功,那么执行命令2……
举例:cp /home/file.txt /opt && echo “Copy file success”
编译源码时:./configure && make && make install
用处:用于脚本的执行的调试。
2.2.使用 || 符号
格式:命令1 || 命令2 || …
说明:如果||左边的命令执行失败了,那么接着执行右边的命令
举例:cp hello.txt copy.txt || echo “Copy file failed”
用处:用于脚本的执行的调试。
3. 命令的组合使用
格式1: “;”一次下达两个以上的命令
格式2: (命令1;命令2;. . .) 在当前shell中执行
格式3:{命令1;命令2; . . . } 在子shell中执行
举例:
1) ls /usr ; cd ; echo “OK”
2) (ls ; cat hello.txt; cd) || echo “success”
3) {ls ; cat hello.txt; cd}|| echo “success”
shell脚本编程
原文:http://blog.csdn.net/huangbo_embed/article/details/18991411