一、shell简介
Shell是一个用C语言编写的程序,通过Shell用户可以访问操作系统内核服务,类似于DOS下的command和后来的cmd.exe。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量、参数、函数、流程控制等等。它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。
二、shell特性
1.shell的通配符(元字符)
①“ * ”
ls in* rm -rf *
rm -rf .pdf
find / -iname "-eth0"
② “ ? ”
touch love loove live l7ve; ll l?ve
③ “[ ] ” (centos 7 不区分大小写)
ll l[io]ve
ll l[^a-z]ve
ll l[^a-z0-9]ve
ll /dev/sd[a-z]
④ “ ( ) ” 在子shell中执行(cd /boot;ls) (umask 077; touch file1000)
⑤ " { } "集合 touch file{1..9}
mkdir /home/{111,222}
mkdir -pv /home/{333/{aaa,bbb},444}
[root@localhost tmp] mkdir -pv /home/{333/{aaa,bbb},444}
mkdir: created directory ‘/home/333’
mkdir: created directory ‘/home/333/aaa’
mkdir: created directory ‘/home/333/bbb’
mkdir: created directory ‘/home/444’
⑥ “ \ ” 转移符,让元字符回归本意
# 将空格使用转移符转移
[root@localhost tmp] touch yu\ tao
-rw-r--r--. 1 root root 0 Mar 9 18:06 yu tao
# 使用转移符将 t n 进行转移
[root@localhost tmp] echo -e "a\tb"
a b
[root@localhost tmp] echo -e "a\nb"
a
b
2.echo的颜色输出
对于echo颜色输出而言,存在两种模式。即前景色与后景色两种。centos规定[30-39]为前景色部分,而[40-50]为后景色部分。
//改变前景色
[root@localhost tmp] echo -e "\e[1;34mThis is a txt.\e[0m"
This is a txt.
//改变后景色
[root@localhost tmp] echo -e "\e[1;42mThis is a txt.\e[0m"
This is a txt.
三、shell变量
1.shell变量的类型:
shell变量分环境变量(全局变量)和普通变量(局部变量)
环境变量亦称为全局变量,可以在建立它们的shell及其派生出来的任意子进程shell中使用;环境变量又分为自定义环境变量和Bash内置的环境变量。
- 自定义变量
定义变量:变量名=变量值 变量名必须以字母或者下划线开头,区别大小写
引用变量:{变量名}
查看变量:echo¥变量名 set (所有变量:包含自定义变量和环境变量)
取消变量:unset 变量名
作用范围:仅在当前shell中生效
实例展示
//方式一:利用if else 判断语句
#!/usr/bin/bash
ip=192.168.146.124
if ping -c1 $ip &>/dev/null;then
echo "$ip is up"
else
echo "$ip is down"
fi
//方式二:利用 read 交互以及 条件判断
#!/usr/bin/bash
read -p "please input a ip:" ip
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is up"
else
echo "$ip is down"
fi
- 环境变量
定义环境变量: 方式一 export back_dir2=/home/backup
方法二: export back_dir1 将自定义变量转换成环境变量
引用环境变量:{变量名}
查看环境变量:echo $变量名 env 例如 env|grep back_dir2
变量作用范围:在当前shell和子shell中有效
[root@localhost ~]# ip1=3.3.3.3
//编写脚本文件并赋权
echo "ip1 is $ip1"
echo "ip2 is $ip2"
//执行shell时会发现不会在子shell中显示。故使用export、
[root@localhost ~]# export ip2=4.4.4.4
[root@localhost ~]# export ip1
在日常生活中几乎很少使用环境变量,大多是情况会使用自定义变量。当脚本过长时。可以尝试编写多个小脚本模块进行调用
//编写pubilc.sh
#!/usr/bin/bash
ip10=1.1.1.1
dir_path=/etc/a.txt
//编写 1.sh
#!/usr/bin/bash
. public.sh 进行调用
echo "ip10 is $ip10"
echo "dir_path is: $dir_path
2.shell位置变量和预定义
①位置变量:如:2 4 6 8 {10}
#!/usr/bin/bash
ping -c1 $1 &>/dev/null
if [ $? -eq 0 ] ; then
echo "$1 is up"
else
echo "$1 is down"
fi
//故执行shell需要编写位置变量
[root@mysql-slave1 test]# sh 1.sh 192.168.146.129
192.168.146.129 is up
②预定义变量
* 所有的参数
# 参数的个数
当前进程的PID
? 上一个命令的返回值 0表示成功
echo "第二个位置参数是$2"
echo "第一个位置参数是$1"
echo "第四个位置参数是$4"
echo "所有参数是:$*"
echo "所有参数是:$@"
echo "参数的个数是:$#"
echo "当前进程的PID是$$"
echo '$1='$1
echo '$2='$2
echo '$3='$3
echo '$*='$*
echo '$@='$@
echo '$#='$#
echo '$$='$$
执行上述脚本可以综合学习位置变量与预定义变量
[root@mysql-slave1 test]# sh tesh.sh a b c yu tao yutao f g
第二个位置参数是b
第一个位置参数是a
第四个位置参数是yu
所有参数是:a b c yu tao yutao f g
所有参数是:a b c yu tao yutao f g
参数的个数是:8
当前进程的PID是1315
$1=a
$2=b
$3=c
$*=a b c yu tao yutao f g
$@=a b c yu tao yutao f g
$#=8
$$=1315
- shell中 @的异同点
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
实例展示
#!/usr/bin/bash
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
//执行结果
[root@mysql-slave1 test]# sh diff.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
- 基础名(basename)的获取 :例如我只想获取vim /etc/sysconfig/network-scripts/ifcfg-eth0中的ifcfg-eth0就可以使用basename
//首先创建一个IP表 ip.txt
[root@mysql-slave1 test]# vim ip.txt
10.18.30.100
192.168.146.129
192.168.193.199
//创建可交互式测试脚本
#!/usr/bin/bash
#如果用户执行脚本时没有加参数,交互提示
if [ $# -eq 0 ];then
echo "usage:`basename $0` + file"
exit
fi
if [ ! -f $1 ];then
echo "error file!"
exit
fi
for ip in `cat $1`
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is up "
else
echo "$ip is down"
fi
done