前言:基础
Centos默认的脚本解析器是bash(bash也是软连接文件sh -> bash)
脚本第一行声明bash脚本:#!/bin/bash
脚本执行
1、sh+脚本名称
2、给脚本赋予权限chmod u+x 脚本名称
,绝对路径and相对路直接径运行
一、变量
需要sorce /etc/profile
和sorce ~/.bashrc
重新加载环境变量
printenv
输出当前环境变量
1、全局变量 /etc/profile
2、局部变量~/.bashrc
3、定义自定义变量export Su7=21.69
,输出变量 echo $Su7
1、关于自定义变量
记住:用户登录之后开启一个解释器bash(-号),当启动一个脚本文件;重新启动一个bash(二号)去执行脚本,二号bash是一号子bash。
1 | sh复制代码[shishu@hadoop1]$ export B=su7 |
如果再去开一个窗口,就意味着开了一个新的bash,不能继承这个同级别的bash变量。
2、特殊变量 $
和 $#
$n
功能描述:n为数字,$0
代表该脚本名称,$1-$9
代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$#
传参数个数
1 | shell复制代码[root@clb1 shell]# cat teshu.sh |
3、特殊变量 $*
和 $@
$*
功能描述:这个变量代表命令行中所有的参数,$*
把所有的参数看成一个整体
$@
功能描述:这个变量也代表命令行中所有的参数,不过$@
把每个参数区分对待
4、特殊变量 $?
$?
功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个$?
变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
1 | sh复制代码echo $? |
二、数学计算
1 | sh复制代码#!/bin/bash |
三、条件判断
1、常用判断条件
(1) 两个整数之间比较
- = 字符串比较
- -lt 小于(less than)
- -le 小于等于(less equal)
- -eq 等于(equal)
- -ne 不等于(Not equal)
- -gt 大于(greater than)
- -ge 大于等于(greater equal)
(2) 按顺文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
(3) 按顺文件关型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)
-d 文件存在并是一个目录(directory)
2 、练习实操
(1) 逻辑语句 &&
和 ||
&&
前面条件成立,后面语句才会执行(逻辑与)
||
前面条件不成立,后面语句才会执行(逻辑或)
1 | sh复制代码[root@clb1 shell]# cat luoji.sh |
(2) 利用命令的执行结果进行判断
判断用户是否存在,创建用户
参考:echo $?
输出的0 和 1 ,表示Y 与 F
1 | sh复制代码#!/bin/bash |
四、流程控制
1、if 判断
基本格式
注意事项: (1) [ 条件判断式 ],中括号和条件判断式之间必须有空格
(2) if后要有空格
1 | sh复制代码if [ 条件判断句 ];then |
案例:判断年龄
1 | sh复制代码[root@clb1 shell]# cat if.sh |
2、case语句
基本格式
注意事项
1)case行尾必须为单词“in”,每一个模式匹配必须以右括号
)
结束2)双分号
;;
表示命令序列结束,相当于java中的break。3)最后的
*)
表示默认模式,相当于java中的default。
1 | sh复制代码case $变量名 in |
案例:判断输入
1 | sh复制代码[root@clb1 shell]# cat case.sh |
3、for 循环
(1) 用法一
基础语法
1 | sh复制代码for ((初始值;循环控制条件;变量变化)) |
案例:1到100的和
1 | sh复制代码#!/bin/bash |
(2) 用法二
基础语法
1 | sh复制代码for 变量 in 值1 值2 值3... |
案例 1:1到100的和
1 | sh复制代码[root@clb1 shell]# cat sum100.2.sh |
1 | sh复制代码[root@clb1 shell]# cat sum100.2.sh |
案例 2:显示/root下面所有文件名称
案例告诉我们,在for循环中,空格和换行都可以进行分割字符
1 | sh复制代码[root@clb1 shell]# cat file.sh |
案例 3:区分$*
和$@
只有$*
和$@
带上双引号代表的意义才不同
踩坑提示
1
2
3
4 > bash复制代码echo "我是你的"
> echo"我是你的"
>
>
在脚本中echo后面有没有空格的含义是不一样的。
如果没有空格整个语句会被认为是一条命令。例如下面的报错
1
2
3
4
5 > markdown复制代码qufen.sh:行3: echo传入脚本的参数是:qqq: 未找到命令
> qufen.sh:行3: echo传入脚本的参数是:www: 未找到命令
> --------------
>
>
1 | sh复制代码[root@clb1 shell]# cat qufen.sh |
4、while循环
案例 :1到100的和
1 | sh复制代码[root@clb1 shell]# cat sum100.3.sh |
五、read读取控制台输入
1、基础语法
read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t: 指定读取值时等待的时间(秒)
参数:
变量:指定读取值的变量名
2、练习实操
案例 : 求1到输入数字的和
1 | sh复制代码[root@clb1 shell]# cat sumx.sh |
for循环
1 | sh复制代码#!/bin/bash |
六、函数
1、系统函数
(1)basename
基本语法
basename命令会删掉所有的前缀包括最后一个(/)字符
也可以指定后缀,来切除末尾
1 | sh复制代码[root@clb1 shell]# basename /root/shell/sumx.sh |
(2)dirname
基本语法
dirname 文件绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分)然后返回剩下的路径(目录的部分)
1 | sh复制代码[root@clb1 shell]# dirname /root/shell/sumx.sh |
(3)综合案例
更换txt文件为sh文件
1 | sh复制代码[root@clb1 shell]# cat zhixing.sh |
2、自定义函数
基本用法
1、必须在调用函数地方之前,先声明函数,shel脚本是逐行运行。不会像其它语言一样先编译。 2、函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
案例练习1:自定义两数之和sum()
利用result承接输入值,利用echo $?
输出。但是return后跟数值n(0-255)有范围,所以建议用下面优化版本。
1 | sh复制代码[root@clb1 shell]# cat zidingyi.1.sh |
优化版本
1 | sh复制代码[root@clb1 shell]# cat zidingyi.3.sh |
案例练习2:求数据的阶乘
1 | sh复制代码[root@clb1 shell]# cat jiecheng.sh |
七、Shell工具
1、cut
1 | sh复制代码[root@clb1 shell]# echo $PATH | cut -d : -f1 |
2、awk
1 | sh复制代码[root@clb1 shell]# awk -F ":" 'BEGIN{print "username,shell"} $NF ~ "/bin/bash$"{print $1","$NF} END{print "END"}' /etc/passwd |
本文转载自: 掘金