前言
为了坚持学习Shell脚本,以此来记录每日学习情况。纯小白,本文只作个人笔记使用,如有雷同,纯属巧合,联系侵删。学习的是尚硅谷的Shell视频
一、shell解释器
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
- Centos默认的解析器是bash
[root@localhost bin]# echo $SHELL
/bin/bash
二、脚本入门
1.脚本格式
- 脚本以
#!/bin/bash
开头
例如:第一个Shell脚本 HelloWorld:
[root@localhost ~]# cat a.sh
#!/bin/bash
echo "HelloWorld"
- 脚本常用执行方式:
- 采用bash或sh+脚本的相对路径或绝对路径
[root@localhost ~]# bash a.sh
HelloWorld
[root@localhost ~]# sh a.sh
HelloWorld
- 采用 ./ +脚本 来执行脚本 (必须具有可执行权限+X)
[root@localhost ~]# ./a.sh
-bash: ./a.sh: Permission denied
[root@localhost ~]# ll
total 8
-rw-------. 1 root root 1259 May 27 05:56 anaconda-ks.cfg
-rw-r--r--. 1 root root 34 Jul 28 21:34 a.sh
[root@localhost ~]# chmod 777 a.sh
[root@localhost ~]# ./a.sh
HelloWorld
又如:第二个Shell脚本 多命令处理:
任务: 在/home/test/目录下创建一个123.txt,在123.txt中增加 "ni hao"
[root@localhost home]# ll
total 0
[root@localhost home]# cat b.sh
#!/bin/bash
cd /home/
mkdir test
touch /home/test/123.txt
echo "ni hao" >> /home/test/123.txt
2.Shell变量
1.系统变量
- $HOME
- $PWD (当前目录)
- $SHELL (默认解析器)
- $USER (当前用户)
2. 自定义变量
- 基本语法:
(1) 变量=值
[root@localhost home]# A=1 ==等号两边没有空格==
[root@localhost home]# echo $A
1
(2) 撤销变量: unset 变量
[root@localhost home]# unset A
[root@localhost home]# echo $A
[root@localhost home]#
(3) 声明静态变量: readonly 变量
[root@localhost ~]# readonly C=1
[root@localhost ~]# echo $C
1
[root@localhost ~]# unset C
-bash: unset: C: cannot unset: readonly variable
[root@localhost ~]#
-
变量定义规则:
(1)变量名称可以由字母、数字、下划线组成,不能以数字开头。
(2)等号两侧不能有空格
(3)变量值若有空格,则用双引号或单引号括起来
(4)把变量提升为全局变量:export 变量名 (可供其他Shell程序使用)
3. 特殊变量
- $n
功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到九个参数。十以上的参数用大括号包含,例如:${10}
[root@localhost ~]# cat a.sh
#!/bin/bash
echo "HelloWorld"
echo "$0 $1 $2"
[root@localhost ~]# bash a.sh 12 cd
HelloWorld
a.sh 12 cd
- $#
作用:获取所有输入参数个数,常用于循环
[root@localhost ~]# cat a.sh
#!/bin/bash
echo "HelloWorld"
echo "$0 $1 $2"
echo "$#"
[root@localhost ~]# bash a.sh 12 cd
HelloWorld
a.sh 12 cd
2 == 2个参数 ==
- $*
作用:代表命令行中所有参数,$* 把所有参数看成一个整体
- $@
作用:代表命令行中所有参数,$@ 把每个参数区分对待
- $?
作用:最后一次执行的命令的返回状态。变量值为0,证明上一个命令正确执行;变量值非0,则不正确
[root@localhost ~]# bash a.sh 12 ab2
HelloWorld
a.sh 12 ab2
2
12 ab2
12 ab2
[root@localhost ~]# echo $?
0
[root@localhost ~]# cd /hoeme/
-bash: cd: /hoeme/: No such file or directory
[root@localhost ~]# echo $?
1
3. 运算符
- 基本语法
(1)“$((运算式))
” 或 “$[]
”
(2) expr +,-,\*,/,%
(加、减、乘、除、取余) expr运算符之间要有空格
[root@localhost ~]# echo $((2+3))
5
[root@localhost ~]# echo $[2+3]
5
[root@localhost ~]# expr 2+3 == 必须有空格 ==
2+3
[root@localhost ~]# expr 2 + 3
5
例如:计算 (1+4)*6
[root@localhost ~]# expr `expr 1 + 4` \* 6
30
[root@localhost ~]# echo $[(1+4)*6]
30
4. 条件判断
1. 基础语法
[ 条件 ]
(condition 条件前后要有空格) 条件非空即为True。例如:[]
返回 False,[ abc ]
返回 True
2.常用判断条件
(1)两个整数之间比较
- =:字符串比较 ——
!=
(不等于) - -lt:小于(less than)
- -le:小于等于(less equal)
- -eq:等于(equal)
- -ne:不等于(not equal)
- -gt:大于(greater than)
- -ge:大于等于(greater equal)
(2)按文件权限比较
-r
: 读权限-w
写权限-x
执行权限
(3)按文件类型比较
-f
文件存在且是常规文件 file-e
文件存在-d
文件存在且是一个目录
[root@localhost ~]# [ 23 -gt 12 ] ==判断23是否大于12==
[root@localhost ~]# echo $? == 返回值为 0 ,说明上一条命令正确执行 ==
0
[root@localhost ~]# touch test.sh
[root@localhost ~]# ll
total 0
-rw-r--r--. 1 root root 0 Jul 30 09:23 test.sh
[root@localhost ~]# [ -x test.sh ] == 判断 test.sh 是否具有执行权限 ==
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -r test.sh ]
[root@localhost ~]# echo $?
0
(4)多条件判断
&&
:表示前一条命令执行成功时,才执行后一条命令||
:表示上一条命令执行失败,才执行下一条命令
5. 流程控制
- if 判断
if [ 条件判断式 ];then
程序
fi ==判断结束==
或者
if [ 条件判断式 ]
then
程序
fi
if
后要有空格
任务: 输入一个数字,如果是1,则输出true;如果是2,则输出false;如果是其他,则什么也不输出。
[root@localhost ~]# cat if.sh
#!/bin/bash
if [ $1 -eq 1 ];then
echo "true"
elif [ $1 -eq 2 ];then
echo "false"
fi
[root@localhost ~]# sh if.sh 1
true
[root@localhost ~]# sh if.sh 2
false
[root@localhost ~]# sh if.sh 3
[root@localhost ~]#
case语句
(1)基本语法: