linux shell脚本编程

什么是shell呢?shell是用C语言编写的程序,它是用户使用 Linux 的桥梁。Shell既是一种命令语言,又是一种程序设计语言。简单来说Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。也可以这样认为,linux中的shell就是linux内核的一个外层保护工具,并负责完成用户与内核之间的交互。

  • 程序:算法+数据结构
  • 数据:是程序的核心
  • 数据结构:数据在计算机中的类型和组织方式
  • 算法:处理数据的方式

编程语言:低级编程语言 、高级编程语言
低级编程语言:机器与汇编
高级编程语言:解释与编译型语言
编译:高级语言-->编译器-->机器代码文件-->执行,如:C,C++
解释:高级语言-->执行-->解释器-->机器代码,如:shell,python,php,JavaScript,perl

三种处理逻辑
顺序执行:程序按从上到下顺序执行
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
循环执行:程序执行过程中需要重复执行多次某段语句

shell脚本创建过程
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
示例:

#!/bin/bash

添加注释,注释以#开头
第二步:加执行权限
给予执行权限,在命令行上指定脚本的绝对或相对路径
第三步:运行脚本
直接运行解释器,将脚本作为解释器程序的参数运行

shell脚本调试

只检测脚本中的语法错误,不真正执行脚本

bash -n test.sh

调试并执行

bash -x test.sh

三种常见脚本错误:语法错误、逻辑错误、命令错误
变量
变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据
变量类型:

  • 内置变量,如:PS1,PATH,UID,HOSTNAME,$$,BASHPID,PPID,$?,HISTSIZE
  • 用户自定义变量

shell中变量命名规则
区分大小写
不能使用程序中的保留字和内置变量:如:if, for
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 "-",和主机名相反
命名习惯
大驼峰:HelloName
小驼峰:helloName
下划线: hello_name

案例:

[root@localhost data]# class=linux
[root@localhost data]# echo $class
linux
[root@localhost data]# echo my class is $class
my class is linux
[root@localhost data]# class1=linux1
[root@localhost data]# echo $class:$class1
linux:linux1
[root@localhost data]# echo ${class}_$class1
linux_linux1
[root@localhost data]# class2=`pwd`
[root@localhost data]# echo $class2
/data

强引用与弱引用
"$name " 弱引用,其中的变量引用会被替换为变量值
'$name ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串

[root@localhost ~]# nums=`seq 10`
[root@localhost ~]# echo $nums
1 2 3 4 5 6 7 8 9 10
[root@localhost ~]# echo "$nums"
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# test='txt'
[root@localhost ~]# echo $test 
txt
[root@localhost ~]# echo "$test"
txt
[root@localhost ~]# echo '$test'
$test

环境变量
linux中的bash
bash的简介
操作系统都是需要通过shell跟内核来交互的,常见的shell有GUI、KDE、sh、csh、bash、tsh、zsh等、而linux中最常用的shell就是bash。

查看进程树:  pstree -p
查找当前bash所在进程的PID:
echo $BASHPID

可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程一般只在系统配置文件中使用,在脚本中较少使用

变量声明和赋值:
声明并赋值
export name=VALUE
declare -x name=VALUE
或者分两步实现
name=VALUE
export name
变量引用:
$name
${name}
显示所有环境变量:
export
删除变量:
unset name

只读变量
只能声明定义,但后续不能修改和删除,即常量。
声明只读变量:

readonly name
declare -r name
案例:
readonly PI=3.14
declare -r PI=3.14

查看只读变量:

readonly [-p]
declare -r

只读变量在程序退出后自动销毁

位置变量:
在执行脚本的过程中,脚本可携带参数

$1, $2, ... 对应第1个、第2个等参数
$0 命令本身,包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数的个数

${10} 要加括号,不然系统会理解成$1与0的结合
清除所有位置变量
set --

退出状态码变量

进程执行后,将使用变量 $? 保存状态码的相关数字,不同的值反应成功或失败,$?取值范例 0-255
$?的值为0 代表成功
$?的值是1到255 代表失败

用户可以在脚本中使用以下命令自定义退出状态码
exit [n]
脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
如果exit后面无数字,终止退出状态取决于exit命令前面命令执行结果
如果没有exit命令, 即未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后
一条命令的状态码

设置脚本安全

set 查看已定义的所有变量

set -ue

-u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
-e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit

$- 变量
echo $-
[root@localhost ~]# echo $-
himBH
B:braceexpand,大括号扩展
H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的
一个历史命令,"!n"返回第 n 个历史命令

实现算术运算:

let var=算术表达式
((var=算术表达式)) 和上面等价
var=$[算术表达式]
var=$((算术表达式))
declare -i var = 数值
echo '算术表达式' | bc

随机数生成器变量:

[root@localhost ~]# echo $RANDOM
25127
man bash  查看bash帮助
/RANDOM

案例:
随机生成1-100之间的数
echo $[RANDOM%100+1]
posted @ 2021-10-25 21:18  咚咚小孩  阅读(177)  评论(0)    收藏  举报