3000字扫盲shell基础知识(新手必备) Posted 2023-02-16 Ever69
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3000字扫盲shell基础知识(新手必备)相关的知识,希望对你有一定的参考价值。
目录
shell基础语法之变量
shell 变量命名
shell 变量调用
shell 变量分类
shell 运算符
运算符种类
关系运算符
布尔运算符
字符串运算符
逻辑运算符
文件测试运算符
shell条件判断&流程控制
单分支if
双分支if
多分支if语句
不论前端还是后端,再学会Linux的基础上,还应该学会写一些简单的Shell。不止是工作,日常中想做一些东西,如果手动做就很累人也费时间,如果你会用Shell脚本处理就很简单了,本文普及的shell的一些基础知识。后面还会持续更新。
shell基础语法之变量
shell 变量命名
变量只能由大小写字母,数字和下划线组成。 变量名称不能以数字开头。 变量可以存储数字类型或者字符串类型。 变量赋值等号两边不能有空格。 字符串的变量可以用单引号或者双引号括起来。
定义变量:
1
2
➜ ~ name=
"xiaoka"
➜ ~ age=2
无效的定义 [
1
2
3
4
root@iz2ze0ajic0vbv28hcdctpz hello]
# 1212=sfds
-
bash
: 1212=sfds: 未找到命令
[root@iz2ze0ajic0vbv28hcdctpz hello]
# ?aasd=hehe
-
bash
: ?aasd=hehe: 未找到命令
shell 变量调用
变量的调用使用$符号或者$符号加上花括号。一般来讲使用花括号的用法。
举例说明:
1
2
3
4
5
[root@iz2ze0ajic0vbv28hcdctpz hello]
# apple=hongfushi
[root@iz2ze0ajic0vbv28hcdctpz hello]
# echo $applepen
[root@iz2ze0ajic0vbv28hcdctpz hello]
# echo $applepen
hongfushipen
如果不加花括号,就会读成applepen为一个变量,因此解析产生了歧义。
shell 变量分类
环境变量:保存操作系统运行时使用的参数。 位置变量:传递脚本参数时使用。 预定义变量:类似于环境变量,不同是它是不能重定义的。 自定义变量:由用户自定义,可用于用户编写的脚本。
自定义变量:
定义变量database:
1
2
3
4
5
6
[root@iz2ze0ajic0vbv28hcdctpz hello]
# database=mysql
[root@iz2ze0ajic0vbv28hcdctpz hello]
# echo $database
mysql
[root@iz2ze0ajic0vbv28hcdctpz hello]
# echo $database
mysql
环境变量:查看全局环境变量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@iz2ze0ajic0vbv28hcdctpz ~]
# printenv
XDG_SESSION_ID=2044
HOSTNAME=iz2ze0ajic0vbv28hcdctpz
TERM=xterm-256color
SHELL=
/bin/bash
HISTSIZE=1000
SSH_CLIENT=113.44.42.209 56074 22
SSH_TTY=
/dev/pts/1
USER=root
MAVEN_HOME=
/usr/local/apache-maven-3
.6.0
MAIL=
/var/spool/mail/root
PATH=
/usr/local/apache-maven-3
.6.0
/bin
:
/usr/local/jdk1
.8.0_191
/bin
:
/usr/local/sbin
:
/usr/local/bin
:
/usr/sbin
:
/usr/bin
:
/root/bin
PWD=
/root
JAVA_HOME=
/usr/local/jdk1
.8.0_191
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=
/root
LOGNAME=root
CLASSPATH=.:
/lib/dt
.jar:
/lib/tools
.jar
SSH_CONNECTION=113.44.42.209 56074 172.17.187.244 22
LC_CTYPE=zh_CN.UTF-8
LESSOPEN=||
/usr/bin/lesspipe
.sh %s
XDG_RUNTIME_DIR=
/run/user/0
_=
/usr/bin/printenv
定义一个环境变量
1
2
3
[root@iz2ze0ajic0vbv28hcdctpz ~]
# export kaka="kaka"
[root@iz2ze0ajic0vbv28hcdctpz ~]
# env |grep kaka
kaka=kaka
删除环境变量
1
2
[root@iz2ze0ajic0vbv28hcdctpz ~]
# unset kaka
[root@iz2ze0ajic0vbv28hcdctpz ~]
# env |grep kaka
w如果长期使用,可以把它们写在配置文件中。/etc/profile 或者 用户家目录的.bash_profile
位置变量 :
我们先定义一个shell。
1
2
3
4
5
6
[root@iz2ze0ajic0vbv28hcdctpz ~]
# cat test.sh
#!/bin/bash
echo
"执行的文件: $0"
echo
"第一个参数: $1"
echo
"第二个参数: $2"
执行查看结果。
[root@iz2ze0ajic0vbv28hcdctpz ~]# chmod +x test.sh [root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2 执行的文件: ./test.sh 第一个参数: 1 第二个参数: 2
预定义变量:
常用的预定义变量有如下几个。
1
2
3
4
5
6
7
8
#!/bin/bash
echo
"执行的文件: $0"
echo
"第一个参数: $1"
echo
"第二个参数: $2"
echo
"所有参数: $*"
echo
"当前脚本的pid: $"
echo
"脚本参数个数: $#"
查看执行结果
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2 执行的文件: ./test.sh 第一个参数: 1 第二个参数: 2 所有参数: 1 2 当前脚本的pid: 30170 脚本参数个数: 2
查看上一个命令执行结果。
[root@iz2ze0ajic0vbv28hcdctpz hello]# ls test [root@iz2ze0ajic0vbv28hcdctpz hello]# echo $? 0
shell 运算符
shell也是一门语言其实和其他的语言运算符大同小异,不过这里我们还是来说一下。本节说一下运算符相关内容。
运算符种类
算数运算符 关系运算符 布尔运算符 逻辑运算符 字符串运算符 文件测试运算符
算数运算符
命令: expr 作用: 求表达式的值 语法: expr 表达式 规则:
运算符号两边要有空格 遇到特殊符号如*号需要在前面加反斜杠 空格和特殊字符串需要用引号括起来
操作:(先编写一个运算相关的shell脚本)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
i=1
j=2
addition=`
expr
$i + $j`
subtraction=`
expr
$i - $j`
multiplication=`
expr
$j \\* $j`
division=`
expr
$j / $i`
mod=`
expr
$j % $i`
echo
"addition=$addition , subtraction=$subtraction , multiplication=$multiplication , division=$division , mod=$mod"
if
[ $i == $j ]
then
echo
"i 等于 j"
fi
if
[ $i != $j ]
then
echo
"i 不等于 j"
fi
查看结果:
➜ ~ ./operation.sh addition=3 , subtraction=-1 , multiplication=4 , division=2 , mod=0 i 不等于 j
关系运算符
操作:(编写脚本)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/bash
num1=5
num2=8
if
[ $num1 -
eq
$num2 ]
then
echo
"$num1 是否等于 $num2 : num1 等于 num2"
else
echo
"$num1 是否等于 $num2: num1 不等于 num2"
fi
if
[ $num1 -
ne
$num2 ]
then
echo
"$num1 是否不等于 $num2: num1 不等于 num2"
else
echo
"$num1 是否不等于 $num2 : num1 等于 num2"
fi
if
[ $num1 -gt $num2 ]
then
echo
"$num1 是否大于 $num2: num1 大于 num2"
else
echo
"$num1 是否大于 $num2: num1 不大于 num2"
fi
if
[ $num1 -lt $num2 ]
then
echo
"$num1 是否小于 $num2: num1 小于 num2"
else
echo
"$num1 是否小于 $num2: num1 不小于 num2"
fi
if
[ $num1 -
ge
$num2 ]
then
echo
"$num1 是否大于等于 $num2: num1 大于或等于 num2"
else
echo
"$num1 是否大于等于 $num2: num1 小于 num2"
fi
if
[ $num1 -
le
$num2 ]
then
echo
"$num1 是否小于等于 $num2: num1 小于或等于 num2"
else
echo
"$num1 是否小于等于 $num2: num1 大于 num2"
fi
操作结果:
➜ ~ ./relation.sh 5 是否等于 8: num1 不等于 num2 5 是否不等于 8: num1 不等于 num2 5 是否大于 8: num1 不大于 num2 5 是否小于 8: num1 小于 num2 5 是否大于等于 8: num1 小于 num2 5 是否小于等于 8: num1 小于或等于 num2
布尔运算符
编写脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
num1=3
num2=23
if
[ $num1 != $num2 ]
then
echo
"$num1 != $num2 : num1 不等于 num2"
else
echo
"$num1 != $num2: num1 等于 num2"
fi
if
[ $num1 -lt 25 -a $num2 -gt 15 ]
then
echo
"$num1 小于 25 且 $num2 大于 15 : 返回 true"
else
echo
"$num1 小于 25 且 $num2 大于 15 : 返回 false"
fi
if
[ $num1 -lt 25 -o $num2 -gt 25 ]
then
echo
"$num1 小于 25 或 $num2 大于 25 : 返回 true"
else
echo
"$num1 小于 25 或 $num2 大于 25 : 返回 false"
fi
查看结果:
➜ ~ ./bool.sh 3 != 23 : num1 不等于 num2 3 小于 25 且 23 大于 15 : 返回 true 3 小于 25 或 23 大于 25 : 返回 true
字符串运算符
编写脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
apple=
"apple"
pen=
"pen"
if
[ $apple = $pen ]
then
echo
"$apple = $pen : apple 等于 pen"
else
echo
"$apple = $pen: apple 不等于 pen"
fi
if
[ $apple != $pen ]
then
echo
"$apple != $pen : apple 不等于 pen"
else
echo
"$apple != $pen: apple 等于 pen"
fi
if
[ -z $apple ]
then
echo
"-z $apple : 字符串长度为 0"
else
echo
"-z $apple : 字符串长度不为 0"
fi
if
[ -n
"$apple"
]
then
echo
"-n $apple : 字符串长度不为 0"
else
echo
"-n $apple : 字符串长度为 0"
fi
if
[ $apple ]
then
echo
"$apple : 字符串不为空"
else
echo
"$apple : 字符串为空"
fi
执行结果:
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./string.sh apple = pen: apple 不等于 pen apple != pen : apple 不等于 pen -z apple : 字符串长度不为 0 -n apple : 字符串长度不为 0 apple : 字符串不为空
逻辑运算符
编写脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
num1=5
num2=8
if
[[ $num1 -lt 10 && $num2 -gt 5 ]]
then
echo
"返回 true"
else
echo
"返回 false"
fi
if
[[ $num1 -lt 10 || $num2 -gt 5 ]]
then
echo
"返回 true"
else
echo
"返回 false"
fi
执行结果:
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./logic.sh 返回 true 返回 true
文件测试运算符
编写脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
~
cat
testfile.sh
#!/bin/bash
file
=
"/root/testfile.sh"
if
[ -r $
file
]
then
echo
"该文件可读"
else
echo
"该文件不可读"
fi
if
[ -x $
file
]
then
echo
"该文件可执行"
else
echo
"该文件不可执行"
fi
if
[ -w $
file
]
then
echo
"该文件可写"
else
echo
"该文件不可写"
fi
if
[ -f $
file
]
then
echo
"该文件是普通文件"
else
echo
"该文件是非普通文件"
fi
if
[ -s $
file
]
then
echo
"该文件为空"
else
echo
"该文件不为空"
fi
if
[ -d $
file
]
then
echo
"该文件是目录"
else
echo
"该文件不是目录"
fi
执行脚本:
➜ ~ ./testfile.sh 该文件可读 该文件可执行 该文件可写 该文件是普通文件 该文件为空 该文件不是目录
shell条件判断&流程控制
其实流程控制的本质是差不多的,只是在语法上稍微有些差别,本节我们来盘一盘。
单分支if
流程示意图:
举例:
1
2
3
4
5
6
7
8
➜
if
cat
if
-one.sh
#!/bin/bash
a=10
if
[ a > 5 ]
then
echo
"a 大于 5"
fi
执行结果:
➜ if ./if-one.sh a 大于 5
双分支if
流程示意图:
举例:
1
2
3
4
5
6
7
8
➜
if
cat
if
-double.sh
#!/bin/bash
age=18
if
[ $age -
ge
18 ];
then
echo
"成年"
else
echo
"未成年"
fi
执行结果:
➜ if ./if-double.sh 成年
多分支if语句
流程示意图:
举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜
if
cat
if
-multi.sh
#!/bin/bash
money=10
if
[ $money -lt 1 ]
then
echo
"1块钱都没有的比皮卡丘决定在家吃土"
elif
[ $money -
ge
1 -a $money -lt 5 ]
then
echo
"老板我要大白兔奶糖"
elif
[ $money -
ge
5 -a $money -
le
10 ]
then
echo
"老板我要巧克力"
else
echo
"老板给我拿个鸡腿"
fi
执行结果:
➜ if ./if-multi.sh 老板我要巧克力
到此这篇关于3000字扫盲shell基础知识的文章就介绍到这了。
以上是关于3000字扫盲shell基础知识(新手必备)的主要内容,如果未能解决你的问题,请参考以下文章
3000字扫盲shell基础知识(新手必备)
3000字扫盲shell基础知识(新手必备)
卫朋3000+ 字 | 2022年产品人必备的23个设计类网站(2.0版)
卫朋3000+ 字 | 2022年产品人必备的23个设计类网站(2.0版)
卫朋3000+ 字 | 2022年产品人必备的23个设计类网站(2.0版)
万字总结之设计模式(扫盲篇)