Shell脚本 1

本文详细介绍了Linuxshell脚本的基础知识,包括shell的作用,脚本构成与执行,路径执行、shell解释器运行,变量基础、重定向方法,以及set-e和set-u的作用。讨论了脚本错误类型、执行逻辑和变量命名规则,以及重定向和管道符的使用。
摘要由CSDN通过智能技术生成

目录

一、shell脚本基础

1.shell的作用

1.2什么是shell脚本及构成

1.3如何执行脚本

1.使用路径执行(需要加权限)

2.直接使用shell解释器来运行脚本的命令(不需要权限)

3.source 和 .(不需要执行权限)

1.4脚本的例子和错误调式

1.三种切到文件夹下的不同

2.执行命令脚本

3.前一条命令错误,不会影响下一跳命令

4.这种情况下,打错不行,所以尽量不要打错

5.命令错误

6.语法错误

7.逻辑错误

1.5脚本执行逻辑及执行方式

1.6set -e

1.7set   -u

二、重定向

2.1重定向

1.命令

2.2多行重定向

2.3管道符

三、变量

3.1变量基础

常见 Shell 变量的类型包括:

3.1.1命名要求

特殊符号


一、shell脚本基础

1.shell的作用

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当
了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执
行的操作传递给内核执行,并输出执行结果。
常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符
等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

cat   /etc/shells###查看当前系统支持的shell

linux中常见的shell

---bash:基于gun的框架下发展的shell
---csh:类似c语言的shell
---tcsh:整合了csh提供了更多功能
---sh:已经被bash替换
---nologin:让用户无法登录

bash (/bin/bash)是目前大多数Linux 版本采用的默认shell

shell脚本用途

- 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
- 减少手工命令的重复输入,一定程度上避免人为错误
- 将软件或应用的安装及配置实现标准化
- 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

1.2什么是shell脚本及构成

- 就是将命令按顺序一一列出,最后自动执行
- 执行需要权限,也可以直接使用路径    
- 脚本其实不复杂,通用脚本环境改变后依然可以使用的脚本

构成

1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python      #!/bin/expect
2. 注释信息:以#开头的语句表示为注释信息         # 注 释 
3. 可执行语句:比如echo命令用于输出“    ”之间的字符串

1.3如何执行脚本

1.使用路径执行(需要加权限)

不管绝对路径还是相对路径执行,都要加权限才行

2.直接使用shell解释器来运行脚本的命令(不需要权限)

3.source 和 .(不需要执行权限)

1.4脚本的例子和错误调式

1.三种切到文件夹下的不同

原因:

使用前两个方式执行脚本会开启子bash去执行

使用source 和 .  会影响当前的bash环境

source 和 .  没有子进程,会影响当前环境

前两种会产生子进程,不会影响当前环境

子进程运行完就会结束,自行消失

2.执行命令脚本

3.前一条命令错误,不会影响下一跳命令

4.这种情况下,打错不行,所以尽量不要打错

5.命令错误

命令出错不会影响接下来的命令继续

hostname
echo 'finsh'

6.语法错误

会影响接下来的命令继续

7.逻辑错误

只能自己去排查

比如:你回家想先吃饭,但你去睡觉了,事情没毛病,但和你一开始的想法,逻辑不对。 

bash    -n###检查语法错误

bash    -e###检查逻辑错误

总结:脚本错误常见的有三种区别

1. 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的

2. 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察

3. 逻辑错误:只能使用 bash -x 进行

写脚本目的:避免人机交互

shell的作用:命令解释器

1.5脚本执行逻辑及执行方式

脚本执行逻辑

1.  顺序执行:程序按从上到下顺序执行         

2.  选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

3.  循环执行:程序执行过程中需要重复执行多次某段语句

执行方式

1. 指定路径去执行文件(需要有执行权限)

[root@localhost ~]# chmod +x /root/host.sh    加权限
指定相对路径./host.sh
指定绝对路径/root/host.sh

2.指定shell解释器去执行(不需要权限)

[root@localhost ~]# bash host.sh 192.168.91.1
与真机网络通顺

指定了使用 bash去执行脚本不需要权限

[root@localhost ~]# . qiuhe.sh
[root@localhost ~]#source qiuhe.sh    // 会影响当前环境
[root@localhost ~]#source first.sh 
当前的目录位于:
/boot
其中以vml开头的文件包括:
-rwxr-xr-x. 1 root root 5.7M 8月   6 21:02 vmlinuz-0-rescue-869dbd607e5e4f758fa152ef2229f2b6
-rwxr-xr-x. 1 root root 5.7M 8月  23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@localhost boot]# 
会影响你的当前目录
[root@localhost ~]# cat qiuhe.sh | bash
结果是5050
[root@test1 ~]# vim first.sh

cd /root
pwd
ls -l
添加执行权限的方法
[root@test1 ~]# $PATH                   //查看系统程序
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin: 没有那个文件或目录
[root@test1 ~]# pwd
/root
[root@test1 ~]# mkdir bin              //新建bin文件夹
[root@test1 ~]# ls
bin  disk.sh  first.sh  gs.sh  g.txt  passwd.txt  sdb.sh  source
[root@test1 ~]# cp first.sh bin/       //将脚本拷入 此方法不限制路径
[root@test1 ~]# first.sh               //执行脚本         
/root
总用量 24
drwxr-xr-x. 2 root root  22 7月  22 11:33 bin
-rwxr-xr-x. 1 root root  62 7月  16 11:05 disk.sh
-rwxr-xr-x. 1 root root  29 7月  22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月  16 14:28 gs.sh
-rw-r--r--. 1 root root  63 7月  16 11:36 g.txt
-rw-r--r--. 1 root root   9 7月  19 10:15 passwd.txt
-rwxr-xr-x. 1 root root  61 7月  16 11:14 sdb.sh
drwxr-xr-x. 2 root root   6 7月  20 09:33 source

[root@test1 ~]# ./first.sh        //需要权限
/root
总用量 24
drwxr-xr-x. 2 root root  22 7月  22 11:33 bin
-rwxr-xr-x. 1 root root  62 7月  16 11:05 disk.sh
-rwxr-xr-x. 1 root root  29 7月  22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月  16 14:28 gs.sh
-rw-r--r--. 1 root root  63 7月  16 11:36 g.txt
-rw-r--r--. 1 root root   9 7月  19 10:15 passwd.txt
-rwxr-xr-x. 1 root root  61 7月  16 11:14 sdb.sh
drwxr-xr-x. 2 root root   6 7月  20 09:33 source

[root@test1 ~]# ./first.sh           
-bash: ./first.sh: 权限不够
[root@test1 ~]# source first.sh            //source无需权限
/root
总用量 24
drwxr-xr-x. 2 root root   6 7月  22 11:41 bin
-rwxr-xr-x. 1 root root  62 7月  16 11:05 disk.sh
-rw-r--r--. 1 root root  29 7月  22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月  16 14:28 gs.sh
-rw-r--r--. 1 root root  63 7月  16 11:36 g.txt
-rw-r--r--. 1 root root   9 7月  19 10:15 passwd.txt
-rwxr-xr-x. 1 root root  61 7月  16 11:14 sdb.sh
drwxr-xr-x. 2 root root   6 7月  20 09:33 source
[root@test1 ~]# sh first.sh        //sh无需权限
/root
总用量 24
drwxr-xr-x. 2 root root   6 7月  22 11:41 bin
-rwxr-xr-x. 1 root root  62 7月  16 11:05 disk.sh
-rw-r--r--. 1 root root  29 7月  22 10:50 first.sh
-rwxr-xr-x. 1 root root 142 7月  16 14:28 gs.sh
-rw-r--r--. 1 root root  63 7月  16 11:36 g.txt
-rw-r--r--. 1 root root   9 7月  19 10:15 passwd.txt
-rwxr-xr-x. 1 root root  61 7月  16 11:14 sdb.sh
drwxr-xr-x. 2 root root   6 7月  20 09:33 source

1.6set -e

#########一旦出错,立即停止

1.7set   -u

变量不存在,不让执行

二、重定向

2.1重定向

类型设备文件文件描述编号默认设备
标准输入/dev/stdin0键盘
标准输出/devstdout1显示器
标准错误输出/dev/stderr2显示器

交互式硬件设备

- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息

重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置

类型操作符用途
重定向输入<从指定的文件读取数据,而不是从键盘输入
重定向输出1>将输出结果保存到指定的文件(覆盖原有内容)
>>将输出结果追加到指定的文件尾部
标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容
2>>标准错误输出结果追加到指定的文件尾部
混合输出&>无论对错都可以重定向将标准输出、标准错误的内容保存到同一个文件中

1.命令

2.2多行重定向

Here Document 概述
使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。
HereDocument是标准输入的一种替代品,
可以帮助脚本开发人员不必使用临时文件来构建输入信息,
而是直接就地生产出一个文件并用作命令的标准输入。

2.3管道符

管道符       |   

将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用

[root@localhost opt]# ls /opt |wc
      2       2      12

修改密码
[root@localhost opt]# echo "123123" |passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新

[root@test1 ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
[root@test1 ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
zhangsan /bin/bash
lisi /bin/bash


 
`   `  $(  )    调用命令执行的结果
'  '  强引用  不识别变量   本来含义
"  "  弱引用  他识别变量
{ }   规定变量的范围

三、变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。

保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。

3.1变量基础

常见 Shell 变量的类型包括:

环境变量:由系统维护,用于设置工作环境      当前目录  当前主机名啊   $PATH     
只读变量:只可以读取不可以更改              只能不能修改    常量   
位置变量:通过命令行给脚本传递参数

3.1.1命名要求

- 区分大小写

- 不能使程序中的保留字和内置变量:如:if, for,hostname   命令  a=   

- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反    

- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH              

- 大驼峰 StudentFirstName 

- 小驼峰 studentFirstName 

- 下划线 student_name

特殊符号

双引号###弱应用,可以识别变量

单引号###强引用,不能识别变量

{     }###定义变量0的范围

``###调用命令的执行结果  =  $()   功能一致

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值