一、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脚本的构成:
第一行:声明解释器(默认bash,可以不写)
注释:#开头,注释的信息,注释不执行
可执行语句:Linux命令都可以作为可执行语句,按照行依次往下执行,一行一个可执行语句
shell执行方式:
第一种:
不给脚本执行权限的执行放方式
**sh:**就在当前的shell里生产一个子shell,允许的结果不改变父shell的环境,只是演示。
**source:**点命令 . 会改变当前shell的环境,也就是真正的执行代码。改变环境
**bash:**就在当前的shell里生产一个子shell,允许的结果不改变父shell的环境。只是演示
调试使用:bash sh
第二种:
脚本调试完毕,都是赋权执行
chmod 777 shell脚本文件名称
当前目录 ./ 非当前目录绝对路径 /opt/test.sh
crontab -e 定时任务
#!/bin/bash
#声明shell的解释器,这一行可以不写,默认就是bash./python expect.(免交互),只要不是默认shell,其他的都要注明解释器。注释不会被执行,步骤的含义
#可以执行的语句
# this is my first shell
cd /boot
echo "当前的位置:"
# echo作用为打印
pwd
echo "当前目录为vml开头的文件"
ls -lh vml*
二、重定向操作:
标准输入:正确的命令输入
标准输出:正确的命令输入之后正确的输出
标准错误输出:错误的命令输入返回输入错误的提示
重定向类型:
**重定向输出:**1、> (只能把标准输出的结果保存到指定文件,会覆盖原有的文件内容)/
2、>> 标准输出的结果保存到文件,不会覆盖原有内容
2> 2>> 标准错误输出的结果,保存到指定的文件
混合输出保存 &> &>> 混合输出保存,既可以保存标准输出,也可以保存标准错误输出
重定向输入:< 从指定文件获取数据。
三、变量
(1)变量的作用:
用来存放系统和用户需要使用的特点的参数(值),变量保存在内存当中。调用的时候,直接从内存当中查找变量所在的内存地址
(2)变量的类型:
**自定义变量:**名称由用户自己定义,值也可以自定义。
变量名的规范:
1、不要使用系统的命令作为变量名
2、不要使用中文名称
3、不要使用特殊符号开头,可以下划线开头
4、不使用数字开头
5、变量名一般使用对应的英文名称来使用
6、变量要保持前后一致,要有注释。提高代码可读性。
变量值:int 整数类型 string 字符串(双引号引起来) 浮点:0.12 布尔:true false
声明的字符串用 " " 引起来
全局变量:
对整个系统生效,所有用户都可以使用
全局生效,每个脚本的变量值,固定的。
持久性
共享性
全局变量适用于不需要经常更改的值
排错方法:bash -n shell脚本名 查看语法是否错误
bash -x shell脚本名 脚本运行的每一步都会进行打印,方便定位哪一步的问题。
环境变量:
环境变量是系统创建的,用来设置用户的工作环境。
环境变量可以理解为特殊的全局变量,/etc/profile配置文件
[root@test2 opt]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
可执行的命令,或者可执行的程序的默认路径
[root@test2 ~]# PATh="$PATH:/root"
[root@test2 ~]# echo $PATH
位置变量:
又叫命令行参数,是在脚本的外面给脚本的内部传值。
$1 $2 $3 $4 $5 $6 $7 $8 $9 从第一个到第九个
10以后要用()把数字括起来
$(10)
[root@test2 opt]# vim test1.sh
a=$1
b=$2
c=$(($a+$b)) # c=$[$a+$b] + - * / %
echo $c
[root@test2 opt]# sh test1.sh 11 12
23
预定义变量:
编程语言和解释器提供,用户无法更改,只能由系统自行更新和设置。
$ 和
@
:
∗
∗
表示命令或者脚本要处理的参数。
∗
∗
两者区别
∗
∗
:处理方式不同
∗
∗
总结:
@:**表示命令或者脚本要处理的参数。**两者区别**:处理方式不同 **总结:
@:∗∗表示命令或者脚本要处理的参数。∗∗两者区别∗∗:处理方式不同∗∗总结: 和
@
∗
∗
不加引号表现一致,都把参数一个一个处理
∗
∗
@**不加引号表现一致,都把参数一个一个处理 **
@∗∗不加引号表现一致,都把参数一个一个处理∗∗***加了引号,会把参数当成一个集体处理
KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲** 也是一个全局变量,统计传…? true false 命令执行之后返回的状态码 只有0表示成功,所有非0都表示失败,返回上一次执行命令的状态码
"$*" $* "$@" $@ 区别
[root@test2 opt]# cat qqq.sh
function print_args {
for arg in "$*" # "$*" 把所有的参数当做一个整体处理
do $* 不加引号,所有参数一个一个处理
echo "$arg" $@、"$@" 结果与 $@结果一致
done
}
print_args "hello" "world" "!"
[root@test2 opt]# sh qqq.sh [root@test2 opt]# sh qqq.sh
hello world ! hello
world
!
$# 用法
[root@test2 opt]# cat qqq.sh
function print_args {
for arg in "$*"
do
echo "$arg"
done
echo "传输了$#个"
}
print_args "hello" "world" "!"
[root@test2 opt]# sh qqq.sh
hello world !
传输了3个
$? 用法
[root@test2 opt]# cat eee.sh
read -p "输入第一个数字" a
read -p "输入第二个数字" b
if [ $a -eq $b ]
then
echo $?
else
echo $?
fi
[root@test2 opt]# sh eee.sh
输入第一个数字11
输入第二个数字11
0
运算的不同表示方法
[root@test2 opt]# cat www.sh
#!/bin/bash
read -p "输入第一个数" a
read -p "输入第二个数" b
# c=$(($a%$b)) 取余
# c=$(($a/$b)) 相除
# c=$(expr $a+$b) 相加
# c=$(expr $a \* $b) 相乘
# let c=$a*$b 相乘
c=$(($a/$b))
echo $c
小数运算:
[root@test2 opt]# cat sss.sh
read -p "第一个数字:" a
read -p "第二个数字:" b
# + - * / % 取余,只能是整数运行。
#小数运算:bc是一个简易的系统自带的计算机程序,可以执行整数,也可以计算小数
c=$(echo "$a+$b" |bc )
echo $c
[root@test2 opt]# sh sss.sh
第一个数字:10.1
第二个数字:11.2
21.3
单引号,双引号,反撇号` 的区别:
单引号
[root@test2 opt]# cat test1.sh
a='tstr'
echo '$a'
[root@test2 opt]# sh test1.sh
$a
双引号
[root@test2 opt]# cat test1.sh
a="tstr"
echo "$a"
[root@test2 opt]# sh test1.sh
tstr
双引号,就是弱引用,变量值就是变量值本身
单引号,强引用,变量值不再是本身定义的值,保持自身的字符串形式
**反撇号,**命令替换,把命令的执行结果传送给变量,作为变量的值,先执行命令,再给变量赋值。
如何自定义输入变量的值?
read -p "提示信息:" 变量的名称
read -p "数字b:" b
c=$(($a+$b))
echo $c
read
-p 指定提示符,提示符的内容包含在 " " 之间," "可以为空,但是双引号必须要有。
修改配置文件/etc/profile文件中 export a=5 export b=6 sh test1.sh (永久生效)
全局变量的使用方法
[root@test2 opt]# vim /etc/profile
export a=5
export b=6
"/etc/profile" 79L, 1995C
[root@test2 opt]# sh test1.sh
11
赋值问题?
i++ 先赋值,再加1
++i 先加1 ,再赋值
i- - 先赋值,再-1
– i 先 - 1 ,再赋值
标签:opt,test2,--,sh,shell,版本,echo,root From: https://blog.csdn.net/qq_52448810/article/details/139603011