Shell脚本01

一、shell脚本

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

脚本的特点:从上到下,按行执行。

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

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

1.1、常见的解释器

sh:已经淘汰

bash:sh的扩展版

csh:类似c语言

tcsh:整合c语言的shell

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

shell的解释器,默认就是bash

1.2、shell的作用

1、自动化运维

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

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

4、避免配置出错

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

1.3、shell脚本的构成

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

格式:

#!/bin/bash

解释: 声明shell的解释器,这一行可以不写,默认的就是bash. 只有不是默认shell,其他的都要声明

第二行开始:可执行语句

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

1.4、shell的执行方式

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

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

source:相当于点命令 **(.)**他会改变当前shell的环境,也是真正的执行代码。

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

例如/opt目录下写一个脚本文件test.sh,后缀名一般为.sh格式,约定俗成方便识别,脚本内容为

使用sh执行脚本文件,执行后仍在opt目录下

使用source执行脚本,执行后按照实际命令行进行切换目录

第二种:赋权方式

脚本调试完毕进行赋权执行,在实际生产中大多数选择这种方式。

对/opt/目录下的test.sh脚本文件进行赋权

chmod 777 /opt/test.sh

在当前opt目录下可以使用./执行脚本

[root@localhost opt]# ./test.sh 

在其他目录下使用绝对路径执行脚本

1.5、重定向

标准输入

标准输出

标准错误输出

注:以下操作的 test.txt的内容从上之下依次执行,观察内容变化

重定向输出:

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

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

将原有内容进行覆盖

2>:标准错误输出的结果,而且会覆盖文件原有的内容。(正确的输出结果没有)

2>>:标准错误输出的结果,原有的内容的尾部追加内容,不会覆盖原有的内容。(正确的输出结果没有)

&>:混合输出,既可以保存错误的输出又可以保存正确是输出,会覆盖文件原有的内容。

&>>:混合输出,既可以保存错误的输出又可以保存正确是输出,不会覆盖原有的内容。

重定向输入 :

< :从指定的文件获取数据,使用有一定的要求和规范,一般不用

二、变量

2.1、变量的作用

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

2.2、变量的类型

int:整数型

string:字符串 声明字符串要用引号引起来" "

浮点:0.12

布尔:true false

注意事项:

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

2、不要使用中文。

3、不要使用特殊符合开头,可以使用_开头,不要使用数字开头。

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

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

2.3、双引号 单引号 反撇号

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

a=10
echo "$a"

输出结果:10

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

a=10
echo "$a"

输出结果:$a

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

#将/opt目录内容展示
c=`ls -a /opt`
echo "$c"

输出结果:

2.4、 自定义输入变量的值

使用read -p, -p指定提示符,提示符的内容包含在" "之间,内容可以为空,但双引号必须要有

格式:read -p "提示信息:" a

实例:

#!/bin/bash

read -p "输入第一个数字a:" a
read -p "输入第二个数字b:" b
c=$(($a+$b))
echo "a+b的结果:" $c

结果 :

2.5、 全局变量

全局变量特点:对整个系统生效,所有用户都可以使用,每个脚本的变量值,固定的

临时全局变量

export a=10 仅限于当前的shell脚本生效

全部全局变量,这种全局变量适应于不需要经常更改的值

shell均可使用通过修改/etc/profile

添加

export a=10

export b=10

2.6、排错方法

bash -n 脚本 查看语法错误

bash -x 脚本 会把每一步都打印出来,方便排错

echo "输出a、b、c的结果:"
a=$1
b=$2
c=$3
d=$($a+$b) 正确格式 d=$(($a+$b))        

结果:将报错行数展示出来

2.6、 环境变量

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

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#包含可执行文件的目录列表,可执行的命令,或程序的程序的默认路径

2.7、 位置变量

位置变量:又叫命令行参数,是在脚本的外面给脚本内部传值

$1 $2...9 10以后要使用{} 例如:{10}.............

实例:脚本内容

echo "输出a、b、c的结果:"
a=$1
b=$2
c=$3
d=$(($a+$b))
echo "d="$d
echo "a="$a
echo "b="$b
echo "c=""$c"       

执行脚本: 1 2 3 分别对应脚本文件的 $1 $2 $3

2.8、 预定义变量

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

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

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

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

#!/bin/bash

echo "*的加引号"
function print_args {

        for arg in "$*"
        do
         echo "$arg"
        done
         echo "传了:$#" "个参数"
}
print_args "1" "2" "3"


echo "*的不加引号"
function print_args {

        for arg in $*
        do
         echo "$arg"
        done
}
print_args "1" "2" "3"


echo "@的不加引号"
function print_args {

        for arg in $@
        do
         echo "$arg"
        done
}
print_args "1" "2" "3"

echo "@的不加引号"
function print_args {

        for arg in "$@"
        do
         echo "$arg"
        done
}

结果:

$? true false 命令执行之后返回的状态码,只有0表示成功,所有非0都表示失败,返回上一次执行的命令的状态码。

实例:

#!/bin/bash
read -p "输入第一个数a:" a
read -p "输入第二个数b:" b
if [ $a -eq $b ]  ##判断a与b是否一致
then
echo $?
else
echo $?
fi

2.9、运算

整数运算:常用 ((a+b)) 、[a+b] 、$(expr $a \* $b) 仅乘法为这个格式、let c= a\*b

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

c=(echo "a+$b" | bc)

也可以awk 'BEGIN{print 4.25*2.3}' 仅限于在命令行使用,无法在脚本文件使用

实例:

#!/bin/bash

read -p "输入第一个数字a:" a
read -p "输入第二个数字b:" b
c=$(echo" $a+$b"| bc)
echo "c的结果:" $c
d=$(expr $a \* $b)
echo "d的结果:" $d
e=$[$a+$b]
echo "e的结果:" $e

结果:

i++ :先赋值在加1 i=((i+1))

++i :先加1,在赋值

i--:先赋值在减1 i=((i-1))

--i:先减1,在赋值

相关推荐
星辰中的维纳斯39 分钟前
vue新手入门教程(项目创建+组件导入+VueRouter)
前端·javascript·vue.js
嫣嫣细语1 小时前
css实现鼠标禁用(鼠标滑过显示红色禁止符号)
前端·css
Days20501 小时前
web前端主要包括哪些技术
前端
XF鸭1 小时前
HTML-CSS 入门介绍
服务器·前端·javascript
forwardMyLife2 小时前
element-plus 的form表单组件之el-radio(单选按钮组件)
前端·javascript·vue.js
fs哆哆2 小时前
ExcelVBA运用Excel的【条件格式】(二)
linux·运维·服务器·前端·excel
安冬的码畜日常3 小时前
【CSS in Depth 2精译】2.5 无单位的数值与行高
前端·css
ilisi_3 小时前
导航栏样式,盒子模型
前端·javascript·css
吉吉安3 小时前
grid布局下的展开/收缩过渡效果【vue/已验证可正常运行】
前端·javascript·vue.js
梦凡尘3 小时前
Vue3 对跳转 同一路由传入不同参数的页面分别进行缓存
前端·javascript·vue.js