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,在赋值

相关推荐
cwj&xyp4 分钟前
Python(二)str、list、tuple、dict、set
前端·python·算法
dlnu20152506226 分钟前
ssr实现方案
前端·javascript·ssr
古木201910 分钟前
前端面试宝典
前端·面试·职场和发展
轻口味2 小时前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王2 小时前
React Hooks
前端·javascript·react.js
迷途小码农零零发2 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
娃哈哈哈哈呀3 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
旭东怪3 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
金创想5 小时前
chrome主页被被篡改的修复方法
chrome·主页篡改