0%

Linux(4)Linux之shell编程

Linux之shell编程

4.1 文件脚本运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
shell是用户与Linux操作系统沟通的桥梁。

shell脚本文件名后缀通常是 .sh

shell脚本第一行内容是: #!/bin/bash

注意:其他以#开头的表示是注释

执行脚本 hello.sh

bash hello.sh # 不需要执行权限也可执行
sh hello.sh # 表示把hello.sh 当作参数传入bash
./hello.sh # 需要有执行权限 chmod 755 hello.sh
hello.sh # 需要添加.到系统变量
vim /etc/profile
export PATH=.:$PATH # 最后一行添加内容
source /etc/profile # 重新加载

4.2 shell中的变量

4.2.1 变量的定义

变量不需要声名,初始化也不需要指定类型

变量命令:只能使用数字,字母和下划线,且不能以数字开头

变量赋值通过“=”进行赋值,再变量,等号和值之前不能出现空格!

1
2
3
4
name=123  # 定义变量
echo $name # 输出变量
echo ${name} # 输出变量
echo ${name}hehe # 在原始的name值后加上hehe

4.2.2 四种变量的使用

4.2.2.1 本地变量

格式:VAR_NAME=VALUE

应用场景:在shell脚本中定义一些临时变量时使用,对子shell进程及其他shell进程无效。

1
2
3
4
name=123
echo name
123

4.2.2.2 环境变量

格式:export VAR_NAME=VALUE

应用场景:用于设置临时环境变量,对子shell进程有效,对其他shell进程无效。

注意:设置永久环境变量,需要添加到配置文件/etc/profile中,然后执行source /etc/profile 可立即生效。

1
2
3
4
5
6
export age=18
echo $age
18
bash
echo $age
18

4.2.2.3 位置变量

$ 0, $ 1, $2 …

格式:location.sh abc xyz

位置变量相当于java中main函数的args参数,可以在shell脚本中动态获取外部参数

location.sh文件内容

1
2
3
4
#!/bin/bash
echo $0
echo $1
echo $2

输出

1
2
3
4
sh location.sh abc xyz
location.sh
abc
xyz

4.2.2.4 特殊变量

$?:上一条命令的返回状态码,状态码在0~255之间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ll
-rw-------. 1 root root 1232 8月 20 19:44 anaconda-ks.cfg
-rw-r--r-- 1 root root 0 11月 29 09:38 a.out
-rw-r--r-- 1 root root 193 11月 26 14:40 h
-rw-r--r-- 1 root root 186 11月 26 14:37 hello.txt
-rwxr----- 1 root root 52300 11月 26 13:43 Linux笔记.md
-rw-r--r-- 1 root root 36 11月 29 11:30 location.sh
-rw-r--r-- 1 root root 40 11月 26 11:30 num
drwxr-xr-x 2 root root 22 11月 29 10:52 shell
echo $?
0
lk
-bash: lk: 未找到命令
echo $?
127

$#:shell脚本所有参数的个数

parm.sh文件内容

1
2
3
#!/bin/bash
echo $#
~

输出

1
2
sh parm.sh 123 x 3
3

4.2.3 变量和引号的特殊使用

‘’:单引号不解析变量 echo ‘$name’

1
2
3
4
echo $name
123
echo '$name'
$name

“”:双引号解析变量echo “$name”

1
2
3
4
echo $name
123
echo ""$name"
123

``:反引号是执行并引用命令的执行结果

1
2
3
4
5
name=pwd
echo $name
pwd
echo `$name`
/root/shell

$(…):是``的另一种写法,效果一样

1
2
3
4
5
name=pwd
echo $name
pwd
echo $($name)
/root/shell

注意: echo ‘“$name”‘

​ echo “‘$name’”

1
2
3
4
echo '"$name"'
"$name"
echo "'$name'"
'pwd'

4.3 循环和判断

4.3.1 for循环

1
2
3
4
for ((i=0;i<1;i++))
do
循环体
done
1
2
3
4
for i in 1 2 3
do
循环体
done

for1.sh代码内容

1
2
3
4
for((i=0;i<1;i++))
do
echo $i
done

结果:

1
2
3
4
5
6
7
8
9
10
0
1
2
3
4
5
6
7
8
9

for2.sh代码内容

1
2
3
4
5
#!bin/bash
for i in 1 2 3
do
echo $i
done

结果

1
2
3
1
2
3

4.3.2 while循环

适用于循环次数未知,或不便于使用for直接生成较大列表时

1
2
3
4
while 测试条件
do
循环体
done

测试条件为”真“,则进入循环,测试条件为”假“,则退出循环。

格式:test EXPR或者[ EXPR ] 中括号和表达式之间的空格不能少。

整型测试:-gt(大于),-lt(小于),-ge(大于等于),-le(小于等于),-eq(等于),-ne(不等于)

字符串测试:=(等于),!=(不等于)

while1.sh代码

1
2
3
4
5
6
#!/bin/bash
while test 2 -gt 1
do
echo yes
sleep 1 # 休眠1秒
done

结果:

1
2
3
4
yes
yes
yes
...

while2.sh 代码

1
2
3
4
5
6
#!/bin/bash
while [ 2 -gt 1 ]
do
echo yes
sleep 1
done

结果:

1
2
3
4
yes
yes
yes
...

while3.sh

1
2
3
4
5
6
#!/bin/bash
while [ "123" != "321"]
do
echo yes
sleep 1
done

结果:

1
2
3
4
yes
yes
yes
...

4.3.3 判断

4.3.3.1 单分支

1
2
3
4
if 测试条件
then
选择分支
fi

if1.sh 代码

1
2
3
4
5
6
#!/bin/bash
flag=$1
if [ $flag -eq 1 ]
then
echo one
fi

结果

1
2
3
4
[root@samba shell]# sh if1.sh 1
one
[root@samba shell]# sh if1.sh 2
[root@samba shell]# sh if1.sh 3

if2.sh 代码

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
if [ $# -lt 1 ]
then
echo "not found param"
exit 100 # 返回状态码 100
fi
flag=$1
if [ $flag -eq 1 ]
then
echo one
fi

结果

1
2
3
4
5
6
7
8
[root@samba shell]# sh if2.sh  
not found param
[root@samba shell]# echo $? # 查看状态码
100
[root@samba shell]# sh if2.sh 1
one
[root@samba shell]# echo $? # 查看状态码
0

4.3.3.2 多分支

1
2
3
4
5
6
if 测试条件
then
选择分支1
else
选择分支2
fi

if3.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
if [ $# -lt 1 ]
then
echo "not found param"
exit 100
fi
flag=$1
if [ $flag -eq 1 ]
then
echo one
else
echo "not support"
fi

结果

1
2
3
4
5
6
[root@samba shell]# sh if3.sh 1
one
[root@samba shell]# sh if3.sh 2
not support
[root@samba shell]# sh if3.sh
not found param

if4.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
if [ $# -lt 1 ]
then
echo "not found param"
exit 100
fi
flag=$1
if [ $flag -eq 1 ]
then
echo one
elif [ $flag -eq 2 ]
then
echo two
else
echo "not support"
fi

结果

1
2
3
4
5
6
7
8
[root@samba shell]# sh if4.sh 1
one
[root@samba shell]# sh if4.sh 2
two
[root@samba shell]# sh if4.sh 3
not support
[root@samba shell]# sh if3.sh
not found param

-------------本文结束感谢您的阅读-------------