首页 > 系统相关 >史上最全shell脚本编程语法上册

史上最全shell脚本编程语法上册

时间:2024-05-01 14:56:54浏览次数:25  
标签:脚本 范例 shell 变量 最全 上册 命令 name

1. shell 脚本语言的基本用法

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

1.2 shell 脚本基本结构
shell脚本编程:是基于过程式、解释执行的语言
编程语言的基本结构:
①各种系统命令的组合
②数据存储:变量、数组
③表达式:a + b
④控制语句:if
格式要求:首行shebang机制

1.3 shell脚本创建过程
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
示例:
#!/bin/bash
添加注释,注释以#开头
第二步:加执行权限
给予执行权限,在命令行上指定脚本的绝对或相对路径
第三步:运行脚本
直接运行解释器,将脚本作为解释器程序的参数运行

1.4 shell 脚本调试
只检测脚本中的语法错误,但无法检查出命令错误,但不真正执行脚本:
bash -n /path/to/some_script
调试并执行:
bash -x /path/to/some_script
脚本错误常见的有三种
①语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的;
②命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察;
③逻辑错误:只能使用 bash -x 进行观察;

2. 变量

变量表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据

2.1 变量类型
①内置变量,如:PS1,PATH,UID,HOSTNAME,$$,BASHPID,PPID,$?,HISTSIZE
②用户自定义变量
不同的变量存放的数据不同,决定了以下
①数据存储方式
②参与的运算
③表示的数据范围
变量数据类型:
①字符
②数值:整型、浮点型,bash 不支持浮点数

2.2 Shell中变量命名法则
2.2.1 命名要求
区分大小写
不能使程序中的保留字和内置变量:如:if, for
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

2.2.2. 命名习惯
见名知义,用英文单词命名,并体现出实际作用,不要用简写,如:ATM
变量名大写
局部变量小写
函数名小写
大驼峰StudentFirstName
小驼峰studentFirstName
下划线: student_name

2.2.3 变量定义和引用
变量的生效范围等标准划分变量类型:
普通变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效;
环境变量:生效范围为当前shell进程及其子进程;
本地变量:生效范围为当前shell进程中某代码片断,通常指函数;

变量赋值:name='value'
value 可以是以下多种形式:
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=COMMAND 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚
本结束,也会自动删除
变量引用:
"$name" 弱引用,其中的变量引用会被替换为变量值
'$name' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
范例:变量的各种赋值方式和引用


范例:变量引用

范例:变量的间接赋值和引用

范例:变量追加值

范例:利用变量实现动态命令

显示已定义的所有变量:set
删除变量:unset

2.2.4 环境变量
环境变量:
①可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
②一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
③一般只在系统配置文件中使用,在脚本中较少使用
变量声明和赋值:
声明并赋值
export name=VALUE
declare -x name=VALUE

或者分两步实现
name=VALUE
export name

变量引用:
$name
${name}

显示所有环境变量:
env
printenv
export
declare -x

查看指定进程的环境变量
cat /proc/$PID/environ
删除变量:
unset name

bash内建的环境变量
PATH
SHELL
USER
UID
HOME
PWD
SHLVL #shell的嵌套层数,即深度
LANG
MAIL
HOSTNAME
HISTSIZE
_   #下划线,表示前一命令的最后一个参数

2.2.5 只读变量
只读变量:只能声明定义,但后续不能修改和删除,即常量
声明只读变量:
readonly name
declare -r name
查看只读变量:
readonly [-p]
declare -r

2.2.6 位置变量
位置变量:在bash shell中内置的变量, 在脚本代码中调用通过命令行传递给脚本的参数。
$1, $2, ... 对应第1个、第2个等参数,shift [n]换位置
$0 命令本身,包括路径
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串
$# 传递给脚本的参数的个数
注意:$@ $* 只在被双引号包起来的时候才会有差异

清空所有位置变量
set --

2.2.7 退出状态码变量
当我们浏览网页时,有时会看到下图所显示的数字,表示网页的错误信息,我们称为状态码,在shell脚
本中也有相似的技术表示程序执行的相应状态。

进程执行后,将使用变量 $? 保存状态码的相关数字,不同的值反应成功或失败,$?取值范例 0-255
$?的值为0 #代表成功
$?的值是1到255   #代表失败

用户可以在脚本中使用以下命令自定义退出状态码
exit [n]

注意:
①脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
②如果exit后面无数字,终止退出状态取决于exit命令前面命令执行结果
③如果没有exit命令, 即未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

2.2.8 展开命令行
展开命令执行顺序
把命令行分成单个命令词
展开别名
展开大括号的声明{}
展开波浪符声明 ~
命令替换$() 和 ``
再次把命令行分成命令词
展开文件通配*、?、[abc]等等
准备I/0重导向 <、>
运行命令

防止扩展
反斜线(\)会使随后的字符按原意解释

加引号来防止扩展
单引号(’’)防止所有扩展
双引号(”“)也可防止扩展,但是以下情况例外:$(美元符号) 

变量扩展
`` : 反引号,命令替换
\:反斜线,禁止单个字符扩展
!:叹号,历史命令替换

2.2.9 脚本安全和 set
set 命令:可以用来定制 shell 环境
$- 变量
h:hashall,打开选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭;
i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的;
m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执行等;
B:braceexpand,大括号扩展;
H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令;
范例:

set 命令实现脚本安全
-u 在扩展一个没有设置的变量时,显示错误信息, 等同set -o nounset
-e 如果一个命令返回一个非0退出状态值(失败)就退出, 等同set -o errexit
-o option 显示,打开或者关闭选项
显示选项:set -o
打开选项:set -o 选项
关闭选项:set +o 选项
-x 当执行命令时,打印命令及其参数,类似 bash -x
范例:

范例:
DIR=/data
cd $DIR
rm -rf *
#rm -rf $DIr/*

2.3 脚本安全和 set
格式
printf "指定的格式" "文本1" ”文本2“……
常用格式替换符

说明:
%#s 中的数字代表此替换符中的输出字符宽度,不足补空格,默认是右对齐,%-10s表示10个字符宽,- 表示左对齐;
%03d 表示3位宽度,不足前面用0补全,超出位数原样输出;
%.2f 中的2表示小数点后显示的小数位数;
常用转义字符

范例:

#.2f 表示保留两位小数

#%-10s 表示宽度10个字符,左对齐

#将十进制的17转换成16进制数

#将十六进制C转换成十进制

2.4 算术运算
Shell允许在某些情况下对算术表达式进行求值,比如:let和declare 内置命令,(( ))复合命令和算术扩
展。求值以固定宽度的整数进行,不检查溢出,尽管除以0 被困并标记为错误。运算符及其优先级,关
联性和值与C语言相同。以下运算符列表分组为等优先级运算符级别。级别按降序排列优先。
注意:bash 只支持整数,不支持小数

乘法符号有些场景中需要转义
实现算术运算:
(1) let var=算术表达式
(2) ((var=算术表达式)) 和上面等价
(3) var=$[算术表达式]
(4) var=$((算术表达式))
(5) var=$(expr arg1 arg2 arg3 ...)
(6) declare -i var = 数值
(7) echo '算术表达式' | bc
内建的随机数生成器变量:
$RANDOM   取值范围:0-32767
范例:
#生成 0 - 49 之间随机数
echo $[$RANDOM%50]
#随机字体颜色

增强型赋值:

格式:
let varOPERvalue

范例:
自加3后自赋值

范例:
自增,自减

范例:

2.5 逻辑运算
true, false
1,真
0,假
与:& 和0相与结果为0,和1相与结果保留原值, 一假则假,全真才真
0 与 0 = 0
0 与 1 = 0
1 与 0 = 0
1 与 1 = 1
范例:

或:| 和1相或结果为1,和0相或结果保留原值,一真则真,全假才假
0 或 0 = 0
0 或 1 = 1
1 或 0 = 1
1 或 1 = 1
范例:

非:!
! 1 = 0   !  true
! 0 = 1 !  false
异或:^
异或的两个值,相同为假,不同为真。两个数字X,Y异或得到结果Z,Z再和任意两者之一X异或,将得出另一个值Y
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
范例:

范例: 变量互换

短路运算
短路与 &&
CMD1 短路与 CMD2
第一个CMD1结果为真 (1),第二个CMD2必须要参与运算,才能得到最终的结果
第一个CMD1结果为假 (0),总的结果必定为0,因此不需要执行CMD2

短路或 ||
CMD1 短路或 CMD2
第一个CMD1结果为真 (1),总的结果必定为1,因此不需要执行CMD2
第一个CMD1结果为假 (0),第二个CMD2 必须要参与运算,才能得到最终的结果

标签:脚本,范例,shell,变量,最全,上册,命令,name
From: https://www.cnblogs.com/zhoutuo/p/18148772

相关文章

  • 反弹shell失败的原因
    reverse_shell失败常规反弹方法失效,curl了一下百度,可以访问(未限制出站ip),curl其他端口可以访问(可能未限制端口)。这里应该限制了出站协议。http协议可以出网,ICMP协议可以出网。这里vps被封了。我们反弹时最好选择443端口或者80端口。反弹shell失败的原因有很多:反弹的命令......
  • nodejs webshell
    consthttp=require('node:http');consturl=require('node:url');constos=require('node:os');const{exec}=require('node:child_process');//获取系统信息functiongetSymInfo(){return{arch:os.arch(),......
  • 自动批量实现linux机器ssh免密shell脚本
    要同时指定SSH端口和密码来实现非交互式地使用ssh-copy-id,可以使用sshpass来实现。sshpass是一个用于通过非交互方式输入密码的工具。下面是一个示例脚本,它使用sshpass、ssh-copy-id以及指定的端口号来实现这一目标:1#!/bin/bash23#检查是否提供了目标主机列表文件4i......
  • Shell 脚本(Bash 版)
    0x01概述(1)Shell简介Shell是一个命令行解释器flowchartLR用户输入命令-->接收并将命令传递给内核执行-->将命令执行的结果返回给用户Shell种类丰富,包括sh、csh、ksh、bash、zsh、fish等以下内容使用的是bash(BourneAgainShell)Linux系统中默认安装的是bashW......
  • ansible 常用模块 shell
    shell模块说明shell模块用于在目标主机上执行命令,类似于在命令行中直接输入命令。这个模块允许你执行任何命令,但是要注意命令的安全性和可重复性。shell模块语法-name:Executeshellcommandansible.builtin.shell:cmd:<command>chdir:<directory>#......
  • shell 命令专栏总结
    一、菜鸟教程1、只读变量readonly使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。#!/bin/bashmyUrl="https://www.google.com"readonlymyUrlmyUrl="https://www.runoob.com"/bin/sh:NAME:Thisvariableisreadonly.2、单引号与双引号的区别......
  • 2024最全 项目管理 软件清单整理
    项目管理软件在当前商业环境中扮演着重要角色,有助于提高项目交付质量。这些工具可优化规划、执行、监控和协作流程,从而提升生产力、降低成本、实现项目目标。市面上存在多种功能不尽相同的项目管理软件,适用于不同规模团队和项目需求。本文将列举一份全面的项目管理软件清单,旨......
  • oracle数据导入导出,备份还原命令expdp&impdp(只导出元数据,不导出表数据,最全,最完善的步
    感谢金龙鱼先生分享,原文来自https://blog.csdn.net/kou869929526/article/details/125791113一,编码要求以及数据库版本要求检查数据库版本(用于决定导出时生成为哪个版本的dmp头文件)selectversionfromv$instance;检查字符集是否一致(字符集不一致,不能导入)selectuserenv(......
  • 21-Shell编程
    21.1正则表达式21.1.4字符集和单词“单词”指的是两侧由非单词字符分隔的字符串。非单词字符指的是字母、数字、下划线以外的任何字符。21.1.5字符类POSIX正则表达式中的字符类类匹配字符[[:alnum:]]文字、数字字符[[:alpha:]]字母字符[[:lower:]]小写......
  • linux修改shell,以及安装zsh配置oh-my-zsh.md
    查看当前shellecho$SHELL查看系统中有哪些shellcat/etc/shells修改shell,输入要切换的shell,例/bin/zshchsh-s/bin/zsh安装zshyuminstall-yzshoh-my-zsh克隆zshgitclonehttps://github.com/robbyrussell/oh-my-zsh.git~/.oh-my-zshgithub拉不下来的话去gitee......