目录:
SHELL概念
- SHELL是什么?
- SHELL是用户与linux内核之间的沟通桥梁
- 用户不能直接操作linux内核
- 用户需要借助中间件SHELL来实现交互。
- SHELL可以接受用户输入的指令,将指令传递给linux内核,linux内核处理指令请求,并将处理完毕的数据返回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编程是什么?
- 将单个或者多个Linux指令,按照一定的逻辑关系和顺序堆积在文本文件中(脚本),文本文件中指令会在SHELL解释器下被执行,这个过程可以称为SHELL编程。
- SHELL脚本文件一般以.sh结尾,建议命令见名知意。
- SHELL编程工具
vi,vim,nano,gedit,sublime,notepad。建议使用vim
- SHELL编程规范
- 脚本代码第一行规范,通常来讲,以#!开头(表示强调+标识),其后借SHELL解释器的类型,例如#!/bin/sh、#!/bin/bash。(SHELL脚本以/bin/sh,/bin/bash解释器去执行SHELL指令)
SHELL编程变量
- 变量定义与回收
[root@linux-node2 ~]# a=123
[root@linux-node2 ~]# echo $a
123
[root@linux-node2 ~]# unset a
[root@linux-node2 ~]# echo $a
- SHELL变量分类
系统变量:
$0 当前脚本的名称;
$n 当前脚本的第 n 个参数,n=1,2,…9;
$* 当前脚本的所有参数(不包括程序本身);
$# 当前脚本的参数个数(不包括程序本身);
$? 命令或程序执行完后的状态,返回 0 表示执行成功;
$$ 程序本身的 PID 号。
环境变量:默认linux系统已经存在的变量,永久生效,可以自定义环境变量:export a=123,将其加入/etc/profile中
PATH 命令所示路径,以冒号为分割;
HOME 打印用户家目录;
SHELL 显示当前 Shell 类型;
USER 打印当前用户名;
ID 打印当前用户 id 信息;
PWD 显示当前所在路径;
TERM 打印当前终端类型;
HOSTNAME 显示当前主机名。
用户变量:
用户自定义的变量,称为用户变量或者局部变量,例如:a=123,DIR=/usr/local/;
第一个SHELL脚本
#!/bin/bash
#This is my First shell
echo "Hello World"
SHELL的if语句
语法格式
# 两个()表示数字比较
if ...;t hen
action1;
else
action2;
fi
if判断括号区别
( )
用于多个命令组、命令替换、初始化数组;
(( ))
整数扩展、运算符、重定义变量值,算术运算比较;
[]
bash 内部命令,[与 test 是等同的,正则字符范围、引用数组元素编号,不支持+-*/ 数学运算符,逻辑测试使用-a、-o。
[[ ]]
bash 程序语言的关键字,不是一个命令,[[ ]]结构比[ ]结构更加通用,不支持+-*/
数学运算符,逻辑测试使用&&、||。
{}
主要用于命令集合或者范围,例如 mkdir -p /data/201{7,8}/
if 常见逻辑运算符
-e filename 如果 filename存在,则为真
-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 空字符串;
|| 单方成立;
&& 双方都成立表达式。
SHELL编程for循环
语法格式
for ... in 列表内容
do
action1;
done
# 例如
for website in www.baidu.com www.taobao.com www.qq.com
do
echo $website
done
# 循环制定次数
# 方法1
for i in `sql 1 100`
do
echo ${i}
done
# 方法2
for i in `echo {1..100}`
do
echo ${i}
done
# 远程批量执行命令
for i in `seq 1 3`
do
ssh -l root 127.0.0.$i "df -h"
done
# 求 1-100 的总和
j=0
for ((i=1;i<=100;i++))
do
j=`expr $i + $j`
done
echo $j
SHELL编程CASE选择
语法
#!/bin/bash
case $1 in
Pattern1)
语句 1
;;
Pattern2)
语句 2
;;
Pattern3)
语句 3
;;
esac
SHELL编程SELECT
常与case配合使用
语法
select i in (表达式)
do
语句
done
实例
#!/bin/bash
PS3="Please enter you select install menu:"
select i in http php mysql quit
do
case $i in
http)
echo Test Httpd.
;;
php)
echo Test PHP.
;;
mysql)
echo Test MySQL.
;;
quit)
echo The System exit. exit
esac
done