shell脚本

了解shell脚本

什么是脚本:

可运行的代码的集合,脚本语言(计算机语言)。

脚本特点:

从上到下,按行执行。

python 脚本语言

格式更严谨 严格的执行缩进。也是从上到下按行执行

shell脚本就是在shell环境(/bin/bash)bash就是shell的解释器。linux下环境下的编程语句。

shell脚本----自动化运维:可重复执行的,自动化的在系统中实现增删改查的操作。

shell的解释器,默认就是bash

sh:已经淘汰

bash:sh的扩展版

csh:类似c语言

tcsh:整合了c语言的shell

nologin:用户无法登录到系统的shell

shell的作用

1、自动化运维

2、批量化的重复操作以及配合定时任务执行

3、有了脚本就可以减轻管理员的工作量

4、避免配置出错

5、提高处理批量文件的速度

shell脚本的构成

复制代码
#!/bin/bash
#声明shell的解释器,可以不写,默认就是bash. python  expect,只要不是默认shell其他都要声>明解释器
#被注释掉的部分是不会执行的,步骤的含义
#可执行语句:
#this is my first shell
cd /boot
echo "当前的目录位置"
#echo的作用就是打印
pwd
echo “展示其中以vml开头的文件”
ls -lh vml*

第一行:声明解释器(默认就是bash,可以不写)

注释:以#开头的,就是被注释掉的信息,注释的部分不会被执行

可执行语句:linux的命令都可以作为可执行的语句,一行一行的往下写。一行就是一个可执行的语句

shell脚本的运行方式

3种

第一种:

不给脚本执行权限的执行方式:

sh:就是在当前的shell里生成一个子shell,运行结果不改变父shell的环境

复制代码
[root@test2 opt]# sh test.sh
当前的目录位置
/boot
“展示其中以vml开头的文件”
-rwxr-xr-x. 1 root root 6.4M 5月  22 02:19 vmlinuz-0-rescue-7c0169c2cb744009b85e2c0fe3276861
-rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64

source:点命令 . 会改变当前shell的环境,也就是真正的执行代码。

复制代码
[root@test2 opt]# source /opt/test.sh
当前的目录位置
/boot
“展示其中以vml开头的文件”
-rwxr-xr-x. 1 root root 6.4M 5月  22 02:19 vmlinuz-0-rescue-7c0169c2cb744009b85e2c0fe3276861
-rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64

bash:就是在当前的shell里生成一个子shell,运行结果不改变父shell的环境

复制代码
[root@test2 opt]# bash test.sh
当前的目录位置
/boot
“展示其中以vml开头的文件”
-rwxr-xr-x. 1 root root 6.4M 5月  22 02:19 vmlinuz-0-rescue-7c0169c2cb744009b85e2c0fe3276861
-rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64

第二种

脚本调试完毕,都是赋权执行

复制代码
[root@test2 opt]# chmod 777 test.sh
[root@test2 opt]# ./test.sh
当前的目录位置
/boot
“展示其中以vml开头的文件”
-rwxr-xr-x. 1 root root 6.4M 5月  22 02:19 vmlinuz-0-rescue-7c0169c2cb744009b85e2c0fe3276861
-rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64

重定向操作:

标准输入:

标准输出:

标准错误输出:

重定向的类型:
重定向输出:> >>

:>标准的输出的结果保存到指定的文件,而且会覆盖文件原有的内容。

:>>标准输出的结果保存到文件原有的内容的尾部追加,不会覆盖原有的内容。

2> 2>> (标准错误输出的结果,保存到指定的文件)

复制代码
[root@test2 ~]# lsaaslf 2>> test1.txt
[root@test2 ~]# cat test1.txt
bash: lsaaslf: 未找到命令...

&> &>> 混合输出,既可以保存标准输出,也可以保存错误的输出

复制代码
[root@test2 ~]# ahsfjkasfuj &> test1.txt
[root@test2 ~]# cat test1.txt
bash: ahsfjkasfuj: 未找到命令...
[root@test2 ~]# ls &>> test1.txt
[root@test2 ~]# cat test1.txt
bash: ahsfjkasfuj: 未找到命令...
anaconda-ks.cfg
initial-setup-ks.cfg
ks.cfg
test1.txt
公共
模板
重定向输入:<

从指定的文件获取数据。

复制代码
[root@test2 opt]# echo 123456 > passwd.txt
[root@test2 opt]# ls
gongxiang  passwd.txt  test.sh
[root@test2 opt]# cat passwd.txt 
123456
[root@test2 opt]# passwd --stdin wbl < passwd.txt 
更改用户 wbl 的密码 。
passwd:所有的身份验证令牌已经成功更新。

变量的作用和类型

变量作用:

用来存放系统和用户需要使用的特定的参数(值),变量保存在内存当中。调用的时候直接到内存当中查找变量所在的内存地址。

变量的类型
自定义变量:

名称由用户自定义 值也可以自定义。

变量名的规范:

1、不要使用系统的命令作为变量名。

2、不要使用中文。

3、不要使用特殊符号开头,可以用下划线开头,不要使用数字开头。

4、变量名一般会使用对应的英文名称来使用。

5、变量要保持前后一致,要有注释。提高代码的可读性。

变量值: int 整数 string 字符串 浮点 0.12 布尔:true false

如果声明的是字符串要用双引号引起来。

复制代码
a="test"                 
echo "$a"
​
a=1
b=2
c=$[$a+$b]
echo $c
​
#自定义输入变量值
read -p "提示信息:" a
read -p "数字b:" b
c=$(($a+$B))
echo $c
#-p  指定提示符,提示符的内容包含在”“中间,”“可以为空,但是双引号必须要有
​
全局变量:

对整个系统生效,所有用户都可以使用。

全局生效,每个脚本的变量值,固定的

持久性

共享性

全局变量适用于不需要经常更改的值。

排错的方法:bash -x 脚本名

环境变量:

环境变量是系统创建的,主要用来设置用户的工作环境。

环境变量可以理解为特殊的全局变量/etc/profile配置文件。

复制代码
[root@test2 opt]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
可执行的命令,或者可执行的程序的默认路径。
位置变量:

又叫做命令行参数,是在脚本的外面给脚本内部传值

$1 $2 $3 $4.....$9

从第一到第九

10以后要用花括号把数字扩起来

${10} ${11}

复制代码
[root@test2 opt]# sh test.sh 10 20
30
200
[root@test2 opt]# cat test.sh 
a=$1
b=$2
c=$(($a+$b))
d=$(($a*$b))
echo $c
echo $d
预定义变量:

编程语言和解释器提供的,用户无法更改,只能由系统自行更新和设备。

\*和@:表示命令或者脚本需要处理的参数。二者的区别在于处理方式不同

\*和@不加引号的表现一致,都是把参数一个一个处理

$*加了引号,会把参数当成一个整体来进行处理。

复制代码
[root@test2 opt]# vim test.sh 
function print_args {
​
for arg in $*   加引号是一行参数  不加是三行参数
do
  echo "$arg"
done
​echo "传了几个:$#"
}
print_args "1" "2" "3"
wq!
[root@test2 opt]# sh test.sh 
1 2 3
[root@test2 opt]# sh test.sh 
1
2
3
传了几个:3

$#也是一个全局变量,统计传递给脚本或者函数参数的个数

复制代码
function print_args {
​
for arg in "$*"
do
  echo "$arg"
done
echo "传了几个:$#"
}
print_args "1" "2" "3" 
​
[root@test2 opt]# sh test.sh 
1 2 3
传了几个:3
​

$? true false 命令执行之后返回的状态码

只有0表示成功了

复制代码
[root@test2 opt]# echo $?
0

所有非0都表示失败

复制代码
[root@test2 opt]# sh test.sh
test.sh:行7: 未预期的符号 `}' 附近有语法错误
test.sh:行7: `}'
[root@test2 opt]# echo $?
2
小数运算

bc是一个简易的系统自带的计算机程序,可以执行整数也可以执行小数

复制代码
read -p "输入第一个数" a
read -p "输入第二个数" b
c=$(echo "$a+$b"|bc)
echo $c
​

i++ 先赋值再加1

++i 先加再赋值

i-- 先赋值再减

--i 先减再赋值

双引号,单引号,反撇号之间的作用和区别:

弱引用和强引用

双引号:就是弱引用,变量值就是变量值的本身

单引号:就是强引用,变量值不再是本身定义的值,保存自身的字符串形式

反撇号:命令替换,把命令的执行结果传给变量,作为变量的值,先执行命令在给变量赋值。

相关推荐
阳爱铭1 小时前
GitHub:现代软件开发的协作平台
驱动开发·后端·中间件·面试·架构·github·学习方法
洛白白4 小时前
# 职场生活之道:善于团结
经验分享·生活·学习方法·日常·人生算法
明明跟你说过5 小时前
无服务器【Serverless】架构的深度剖析:组件介绍、优缺点与适用场景
微服务·云原生·容器·架构·serverless·运维开发·无服务器
顶顶年华正版软件官方5 小时前
关键帧功能怎么使用 关键帧控制视频特效怎么用 会声会影视频剪辑软件教程
前端·javascript·音视频·学习方法·关键帧·会声会影教程·视频剪辑软件
小小的木头人6 小时前
使用阿里云效API操作流水线
python·阿里云·云计算
编程刘明8 小时前
学会拥抱Python六剑客,提高编程效率
开发语言·数据库·python·程序人生·职场和发展·学习方法
18 小时前
客观分析-自己和本科学生之间的差距
开发语言·python·深度学习·学习·学习方法
齐鲁物联网测试18 小时前
信创产业政策,信创测试方面
功能测试·安全·云计算·信息与通信
sh_djoin19 小时前
ANSYS新能源汽车动力电池仿真应用案例
人工智能·数学建模·云计算·汽车·制造
九河云1 天前
AWS的收费方式与计费项目
云计算·aws