Shell 简介
什么是shell
shell 本质上是 linux 命令,一条一条命令组合在一起,实现某一个目的,就变成了shell脚本。它从一定程度上 减轻了工作量,提高了工作效率。
官方化的shell 介绍
Shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出,简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。
常见的shell
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
最常用的shell是Bash,也就是Bourne Again Shell。Bash由于易用和免费,在日常工作中被广泛使用,也是大多数Linux操作系统默认的Shell环境。
Shell 程序编程流程控制语句
if条件语句
if 条件语句
# If条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断
# 单分支语句 ---比较大小
if (条件表达式);then
语句1
fi
# 双分支if 语句
if (表达式)
语句1
else
语句2
fi
# 多支条件语句 ---判断成绩
if (表达式)
语句1
elif
语句2
elif
语句2
fi
常见逻辑判断运算符
-f 判断文件是否存在 eg: if [ -f filename ];
-d 判断目录是否存在 eg: if [ -d dir ];
-eq 等于,应用于整型比较 equal;
-ne 不等于,应用于整型比较 not equal;
-lt 小于,应用于整型比较 letter;
-gt 大于,应用于整型比较 greater;
-le 小于或等于,应用于整型比较;
-ge 大于或等于,应用于整型比较;
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式;
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式;
-z 空字符串;
-x 是否具有可执行权限
|| 单方成立;
&& 双方都成立表达式。
for循环语句
for 循环语句
#格式:for name [ [ in [ word ... ] ] ; ] do list ; done
for 变量名 in 取值列表; do
语句 1
done
while循环语句
while循环语句
# While循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于需要循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while…do开头,done结尾与
#while 关联的还有一个 until 语句,它与 while 不同之处在于,是当条件表达式为 false 时才循环,实际使用中比较少,这里不再讲解。
while (表达式)
do
语句1
done
Break 和continue语句
# break 和 continue 语句
break 是终止循环。
continue 是跳出当前循环。
#示例 1:在死循环中,满足条件终止循环
while true; do
let N++
if [ $N -eq 5 ]; then
break
fi
echo $N
done
输出: 1 2 3 4
#示例 2:举例子说明 continue 用法
N=0
while [ $N -lt 5 ]; do
let N++
if [ $N -eq 3 ]; then
continue
fi
echo $N
done
输出: 1 2 4
# 打印 1-100 数字
i=0
while ((i<=100))
do
echo $i
i=`expr $i + 1`
done
case esac选择语句
case...esac与switch...case 语句类似,是一种多分支选择结构
case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 下面的脚本提示输入1到4,与每一种模式进行匹配:
#!/bin/bash
echo 'Input a number between 1 to 4'echo -e 'Your number is:\c'
read aNum
case $aNum in1) echo 'You select 1'
;;
2) echo 'You select 2'
;;
3) echo 'You select 3'
;;
4) echo 'You select 4'
;;
*) echo 'You do not select a number between 1 to 4'
;;
esac
select选择语句
Linux expect使用
expect 介绍:是一种扩展性语言,主要完成系统交互方面的功能,比如SSH、FTP 等,这些程序都要手工与它们进行互动,而使用expect 就可以模拟人手工互动的过程,使用一种自动的方式控制。
expect 常用命令:
spawn 交互程序开始后面跟命令或者指定程序
expect 等待一个进程的反馈,获取匹配信息匹配成功则执行expect后面的程序动作
send exp_send 用于发送指定的字符串信息
exp_continue 在expect中多次匹配就需要用到
send_user 用来打印输出 相当于shell中的echo
exit 退出expect脚本
eof expect执行结束 退出
set 定义变量
puts 输出变量
set timeout 设置超时时间
interact 退出自动化,开始允许用户交互
expect 中,有三个重要的主命令,分别是spawn、expect、exp_send
spawn 命令
spawn 命令是expect的初始命令,它用于启动一个进程,例如:
spawn ssh root@172.31.3.80
expect 命令用于等候一个相匹配的输出,一旦匹配就执行后面的动作,这个命令接受几个特有的参数,用的最多的就是-re,表示使用正则表达式的方式匹配,例如:
spawn ssh root@172.31.3.80
expect "password:" {exp_send "root\r"}
从上面的例子可以看出,expect是依附与spawn命令的,当执行ssh命令后,expect就匹配命令执行后的关键字:password:,如果匹配到关键字就会执行后面包含在{}括号中的exp_send动作,匹配以及动作可以放在二行,这样就不需要使用{}括号了,就像下面这样,实际完成的功能与上面是一样的:
spawn ssh root@192.168.0.1
expect “password:”
exp_send “word\r”
expect命令还有一种用法,它可以在一个expect匹配中同时匹配多个关键字,只需要将关键字放在一个大括号中就可以了:
spawn ssh root@192.168.0.1
expect {
-re “password:” {exp_send “word\r”}
-re “TopsecOS#” { }
Set 设置 expect变量
set 变量名 #读取变量的方法
puts $变量名 #读取变量的方法
例子:
#!/usr/bin/expect -f #注:这里的-f不是必须
set timeout 30
spawn ssh root@127.0.0.1
expect { #注:关键字与大括号之间有个空格
"yes/no" {send "yes\r" ; exp_continue }
"password:" {send "root\r" }
}
interact
解释:
1. [#!/usr/bin/expect]
这一行告诉操作系统脚本里的代码使用哪一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
注意:这一行需要在脚本的第一行。
2. [set timeout 30]
设置超时时间的,现在你只要记住他的计时单位是:秒
注:如果设置为-1,不予超时
3. [spawn ssh root@127.0.0.1]
spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。 它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
4. [expect "password:"]
expect {
"yes/no" { send "yes\r" ;exp_continue}
"password:" { send "123456\r"}
}
这里的expect也是expect的一个内部命令,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。
这个命令的意思是判断上次输出结果里是否包含“yes/no”的字符串,如果有则立即通过send返回一个值,继续判断是否带有password字符串 有则通过send返回一个值 ,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒
5. [send "root\r"]
这里就是执行交互动作,与手工输入密码的动作等效。
温馨提示: 命令字符串结尾别忘记加上 “\r”,如果出现异常等待的状态可以核查一下。
6. [interact]
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
log_file
log_file 命令用来将输出记录到一个文件中去。格式:
log_file <选项> 文件名
选项包括下面几种
-open 当一个文件已经被打开时,使用这个选项可以往这个文件里继续添加内容,这个选项一般用于windows系统,因为windows系统中文件是独占的,Linux系统中就不存在这个问题了。
-leaveopen 当文件已经被打开时,不继续向这个文件中添加内容。
-noappend 如果文件已存在,那么清空文件中的内容,然后再写入。
Linux screen 命令
screen //创建终端
# screen vi ~/main.c //创建 screen 终端 ,并执行 vi命令
再终端下,按下Ctrl+a //离开screen 终端
screen -ls //显示已创建的screen 终端
screen -r 2276 //连接screen_id 为 2276 的screen 终端