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

相关推荐
C澒5 小时前
多场景多角色前端架构方案:基于页面协议化与模块标准化的通用能力沉淀
前端·架构·系统架构·前端框架
崔庆才丨静觅5 小时前
稳定好用的 ADSL 拨号代理,就这家了!
前端
江湖有缘5 小时前
Docker部署music-tag-web音乐标签编辑器
前端·docker·编辑器
恋猫de小郭6 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
崔庆才丨静觅12 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606113 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了13 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅13 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅14 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅14 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端