1、Shell概述
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。
2、Shell解析器
① Linux提供的Shell解析器
[root@hadoop ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
② sh和bash的关系
[root@hadoop bin]# ll | grep bash
-rwxr-xr-x 1 root root 960472 Dec 7 2016 bash
lrwxrwxrwx 1 root root 4 Aug 18 2017 sh -> bash
可以看出sh是bash的软连接
③ Centos默认的解析器是bash
[root@izwz923wscm1q3eumry71kz bin]# echo $SHELL
/bin/bash
3、Shell脚本入门
1.脚本格式
脚本以#!/bin/bash开头(指定解析器)
2.第一个Shell脚本:helloworld
[root@hadoop shell]$ touch helloworld.sh
[root@hadoop shell]$ vi helloworld.sh
在helloworld.sh中输入如下内容
#!/bin/bash
echo "helloworld"
3.脚本的常用执行方式
①采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)
sh+脚本的相对路径/绝对路径 或 bash+脚本的相对路径/绝对路径
[root@hadoop shell]$ bash helloworld.sh
Helloworld
[root@hadoop shell]$ sh helloworld.sh
Helloworld
②采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
[root@hadoop shell]$ chmod 777 helloworld.sh
[root@hadoop shell]$ ./helloworld.sh
Helloworld
注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
4.多命令处理
需求:在/root目录下创建一个note.txt,在note.txt文件中增加“I love shell”。
[root@hadoop shell]$ touch batch.sh
[root@hadoop shell]$ vi batch.sh
在batch.sh中输入如下内容
#!/bin/bash
cd /home/atguigu
touch cls.txt
echo "I love cls" >>cls.txt
4、Shell中的变量
4.1 系统变量
常用系统变量:$HOME、$PWD、$SHELL、$USER
等
查看系统变量的值:
[root@hadoop shell]$ echo $HOME
显示当前Shell中所有变量:
[root@hadoop shell]$ set
4.2 自定义变量
基本语法:
① 定义变量:变量=值
② 撤销变量:unset 变量
③ 声明静态变量:readonly变量,注意:不能unset
变量定义规则:
① 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
② 等号两侧不能有空格
③ 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
④ 变量的值如果有空格,需要使用双引号或单引号括起来。
4.3 特殊变量
①$n
基本用法:$n
(功能描述:n为数字,$0
代表该脚本名称,$1
-$9
代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
[root@hadoop shell]# touch parameter.sh
[root@hadoop shell]# vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
[root@hadoop shell]# chmod 777 parameter.sh
[root@hadoop shell]# ./parameter.sh cls xz
./parameter.sh cls xz
②$#
基本用法:$#(功能描述:获取所有输入参数个数,常用于循环)。
[root@hadoop shell]# vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
[root@hadoop shell]# chmod 777 parameter.sh
[root@hadoop shell]# ./parameter.sh cls xz
parameter.sh cls xz
2
③$*、$@
基本用法:
$*
(功能描述:这个变量代表命令行中所有的参数,$*
把所有的参数看成一个整体)
$@
(功能描述:这个变量也代表命令行中所有的参数,不过$@
把每个参数区分对待)
[root@hadoop shell]# vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@
[root@hadoop shell]# bash parameter.sh 1 2 3
parameter.sh 1 2
3
1 2 3
1 2 3
④$?
基本用法:$?
(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
[root@hadoop shell]# ./helloworld.sh
hello world
[root@hadoop shell]# echo $?
0
5、运算符
基本语法:
1、“$((运算式))”或“$[运算式]”
2、expr + , - , *, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
(1)计算3+2的值
[root@hadoop shell]# expr 2 + 3
5
(2)计算3-2的值
[root@hadoop shell]# expr 3 - 2
1
(3)计算(2+3)X4的值
(a)expr一步完成计算
[root@hadoop shell]# expr `expr 2 + 3` * 4
20
(b)采用$[运算式]方式
[root@hadoop shell]# S=$[(2+3)*4]
[root@hadoop shell]# echo $S
6、条件判断
基本语法:[ condition ](注意condition前后要有空格),注意:条件非空即为true,[] 返回false。
常用判断条件:
① 两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
② 按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
③ 按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
(1)23是否大于等于22
[root@hadoop shell]# [ 23 -ge 22 ]
[root@hadoop shell]# echo $?
0
(2)helloworld.sh是否具有写权限
[root@hadoop shell]# [ -w helloworld.sh ]
[root@hadoop shell]# echo $?
0
(3)/home/shell/cls.txt目录中的文件是否存在
[root@hadoop shell]# [ -e /home/shell/cls.txt ]
[root@hadoop shell]# echo $?
1
7、流程控制
7.1 if判断
基本语法:
1、
if [ 条件判断式 ];then
程序
fi
2、
if [ 条件判断式 ]
then
程序
elif[ 条件判断式 ]
then
程序
else
程序
fi
注意事项:
1.[ 条件判断式 ],中括号和条件判断式之间必须有空格
2.if后要有空格
实操:
##单个if流程的使用
if [ $1 -ge 3 ];then
echo "hello if"
fi
##if-elif-else的使用
#!/bin/bash
if [ $1 -ge 3 ]
then
echo "hello if"
elif [ $1 -ge 2 ]
then
echo "hello if2"
else
echo "hello if3"
fi
7.2 case语句
基本语法:
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
*)
其他程序
;;
esac
注意事项:
1.case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2.双分号“;;”表示命令序列结束,相当于java中的break。
3.最后的“*)”表示默认模式,相当于java中的default。
实操:
#!/bin/bash
case $1 in
"1")
echo "Hello A"
;;
"2")
echo "Hello B"
;;
*)
echo "Hello C"
;;
esac
7.3 for循环
基本语法1:
for((初始值;循环控制条件;变量变化))
do
程序
done
实操:
s=0
for((i=0;i<100;i++))
do
s=$[ s+i ]
done
echo $s
基本语法2:
for 变量 in 值1 值2 值3...
do
程序
done
实操:
for i in "$@"
do
echo "I love this $i"
done
注:$*和$@的区别
当不被双引号包围的时候,$*和$@参数均会以$1 $2 ... $n的的形式输出
当被双引号包围的时候,$*参数会被当做一个整体输出
7.4 whilie 循环
基本语法:
while [ 条件判断式 ]
do
程序
done
实操:
#!/bin/bash
i=5
while [ $i -gt 1 ]
do
i=$[ i =$i-1 ]
echo $i
done