一、简析shell
shell是一个命令行解释器,接收应用程序、用户命令,调用操作系统内核。
1、Linux提供的shell解释器:
输入 cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
2、bash和sh的关系
sh是bash的软连接,bash和sh是同一个解释器
3、centos默认的解析器是bash
二、shell脚本
1、脚本格式
脚本以**#!/bin/bash**开头(指定解析器)
2、创建第一个shell脚本
#创建文件夹存放shell练习的脚本
[root@hadoop100 ~] mkdir ./data
#在data文件夹中创建HelloWorld脚本
[root@hadoop100 ~] cd data/
[root@hadoop100 data] touch helloworld.sh
[root@hadoop100 data] vim helloworld.sh
#!/bin/bash
echo "helloworld!!!"
#执行脚本的方式1
[root@hadoop100 data] bash helloworld.sh
helloworld!!!
#执行脚本的方式2
[root@hadoop100 data] sh helloworld.sh
helloworld!!!
#执行脚本的方式3
[root@hadoop100 data] ll
总用量 4
-rw-r--r--. 1 root root 35 2月 19 17:49 helloworld.sh
#将文件更改为可执行的文件
[root@hadoop100 data] chmod 744 helloworld.sh
[root@hadoop100 data] ll
总用量 4
-rwxr--r--. 1 root root 35 2月 19 17:49 helloworld.sh
[root@hadoop100 data] ./helloworld.sh
helloworld!!!
三、变量
1、常用的系统
变量
$HOME 根目录
$PATH 环境变量
$PWD 路径
$SHELL shell解释器
$USER 登录的用户
set 显示全部的变量
2、自定义变量
2.1、基本语法
变量=值(中间不能有空格)
撤销变量: unset 变量名
静态变量: readonly 变量(不能用unset)
2.2、变量名命名规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
2.3、实验
#定义变量A $A相当于是取地址符号
[root@hadoop100 data] A=9
[root@hadoop100 data] echo $A
9
#撤销变量
[root@hadoop100 data] unset A
[root@hadoop100 data] echo $A
#变量默认的类型是字符串类型,不能进行数值运算
[root@hadoop100 data] A=1+2
[root@hadoop100 data] echo $A
1+2
#如果变量有空格,用双引号或单引号包裹
[root@hadoop100 data] D="hei boy"
[root@hadoop100 data] echo $D
hei boy
#export提升变量为全局变量
[root@hadoop100 data] vim helloworld.sh
[root@hadoop100 data] ./helloworld.sh
helloworld!!!
[root@hadoop100 data] export D
[root@hadoop100 data] ./helloworld.sh
helloworld!!!
hei boy
3、特殊变量
3.1 $n
功能:n为数字,$0表示脚本名称,$1 - $9表示第1-9个参数,10以上的参数用大括号包含${10}
[root@hadoop100 data] touch parameter.sh
[root@hadoop100 data] vim parameter.sh
#!/bin/bash
echo "$1 $2"
[root@hadoop100 data] chmod 744 parameter.sh
[root@hadoop100 data] ./parameter.sh hei boy
hei boy
3.2 $#
功能:获取所有输入参数个数,常用于循环
[root@hadoop100 data] vim parameter.sh
#!/bin/bash
echo "$1 $2"
echo $#
[root@hadoop100 data] ./parameter.sh hei boy
hei boy
2
3.3 $ $@*
$* 功能:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 功能:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
注意:如果想让@ 体现区别必须用双引号括起来才生效
[root@hadoop100 data] vim parameter.sh
#!/bin/bash
echo "$1 $2"
echo $#
echo $*
echo $@
[root@hadoop100 data] ./parameter.sh 1 2 3
1 2
3
1 2 3
1 2 3
3.4 $?
功能:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确了。
[root@hadoop100 data] ./parameter.sh 1 2 3
1 2
3
1 2 3
1 2 3
[root@hadoop100 data] echo $?
0
四、运算符
基本语法
$((运算式)
$[运算式]
[root@hadoop100 data] d=$((3+2))
[root@hadoop100 data] echo $d
5
[root@hadoop100 data] c=$[3+2]
[root@hadoop100 data] echo $c
5
五、条件判断
1、基本语法
(1)test condition
(2)[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ root ]返回true,[] 返回false。
2、常用得判断条件
(1)两个整数之间比较
== 字符串比较
-lt 小于(less than) | -le 小于等于(less equal) |
-ge 大于等于(greater equal) | -ne 不等于(Not equal) |
-eq 等于(equal) | -gt 大于(greater than) |
(2)按照文件权限进行判断
-r 有读的权限(read) | -w 有写的权限(write) | -x 有执行的权限(execute) |
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file) | -e 文件存在(existence) | -d 文件存在并是一个目录(directory) |
#判断大小的正确
[cy@hadoop100 ~]$ [ 22 -ge 12 ]
[cy@hadoop100 ~]$ echo $?
0
#查看某文件是否有写权限
[cy@hadoop100 data]$ [ -w hello.sh ]
[cy@hadoop100 data]$ echo $?
0
(4)多条件判断
&& 表示前一条命令执行成功时,才执行后一条命令;
|| 表示上一条命令执行失败后,才执行下一条命令;
六、流程控制
6.1、if判断
1、基本语法
if [ 条件判断式 ];then
程序
fi
if [ 条件判断式 ]
then
程序
elif[ 条件判断式 ]
then
程序
else
程序
fi
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
1、touch if.sh
2、vim if.sh
#!/bin/bash
if [ $1 -eq "1" ]
then
echo "hei boy!!!"
elif [ $1 -eq "2" ]
then
echo "hei girl!!!"
fi
3、chmod 744 if.sh
4、./if.sh 2
6.2 case语句
1、基本语句
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
(1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
(2)双分号 “;;” 表示命令序列结束,相当于java中的break。
(3)最后的 “*)” 表示默认模式,相当于java中的default。
[cy@hadoop100 data]$ touch case.sh
[cy@hadoop100 data]$ chmod 744 case.sh
[cy@hadoop100 data]$ vim case.sh
#!/bin/bash
case $1 in
"1")
echo "hei boy!!!"
;;
"2")
echo "hei girl!!!"
;;
*)
echo "hei!!!!"
;;
esac
[cy@hadoop100 data]$ ./case.sh 2
hei girl!!!
6.3 for 循环
1、基本语法
for ((初始值;循环控制条件;变量变化))
do
程序
done
[cy@hadoop100 data]$ touch for.sh
[cy@hadoop100 data]$ chmod 744 for.sh
[cy@hadoop100 data]$ vim for.sh
#!/bin/bash
s=0
for ((i=0;i<=100;i++))
do
s=$[i+s]
done
echo $s
[cy@hadoop100 data]$ ./for.sh
5050
2、基础语法2
for 变量 in 值1 值2 值3 ……
do
程序
done
[cy@hadoop100 data]$ vim for2.sh
#!/bin/bash
#$*将所有的参数作为一个整体,如果要其实作为整体输出就必须要加上“$*”才能达到这个效果,
其他的不行
for i in $*
do
echo "hei $i"
done
#$@ 参数不是作为一个整体是将参数分开来
for j in $@
do
echo "hei $j"
done
for k in "$*"
do
echo "hei $k"
done
for m in "$@"
do
echo "hei $m"
done
[cy@hadoop100 data]$ ./for2.sh boy girl
hei boy
hei girl
hei boy
hei girl
hei boy girl
hei boy
hei girl
6.4 while循环
1、基本语法
while [ 条件判断式 ]
do
程序
done
[cy@hadoop100 data]$ vim while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
[cy@hadoop100 data]$ ./while.sh
5050