shell脚本-基础

编程基础

	程序是指令+ 数据
程序编程风格:
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
shell 程序提供了编程能力,解释执行。
计算运行二进制指令。
编译执行:
高级语言--> 编译器--> 目标代码
如java,C#
解释执行:
高级语言--> 解释器--> 机器代码
如shell, perl, python 编程逻辑处理方式:
顺序执行
循环执行
选择执行 shell 编程:
过程式、解释执行 编程语言的基本结构:
各种系统命令的组合
数据存储:变量、数组等
表达式: a + b等
语句:if的等

shell脚本说明

	shell 脚本:
包含一些命令或声明,并符合一定格式的文本文件
shell 脚本的用途有:
自动化常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或文件
格式要求:
首行shebang 机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
....
#! 就是告诉系统,这个脚本文件需要使用指定的命令解释器来执行。
紧随 #!的是一个路径名,此路径指向用来解释此脚本的程序,它可以是shell,可以是程序设计语言,也可以是实用程序。
这个解释器从头( #!的下一行)开始执行整个脚本的命令,同时忽略注释。
shell脚本的创建和运行:
创建脚本:
使用文本编辑器vim等来创建文本。
第一行必须是shell声明序列#!,一般为#!/bin/bash。
其余行为执行的命令。
添加注释使用#,注释以#开头。
运行脚本:
给予执行权限,在命令行上指定脚本的绝对或相对路径
chmod +x FILE.sh
/PATH/TO/FILE.sh
直接运行解释器,将脚本作为解释器程序的参数运行
source or . +脚本,一般不这么用,这样会对当前环境进行影响
bash + 脚本,就不会影响外部工作环境
脚本规范:
脚本代码开头约定
1 、第一行一般为调用使用的语言
2 、程序名,避免更改文件名为无法找到正确的文件
3 、版本号
4 、更改后的时间
5 、作者相关信息
6 、该程序的作用,及注意事项
7 、最后是各版本的更新简要说明
脚本开头的示例:
#!/bin/bash
#-------------------------------------------------
#Filename:
#Description:
#Revision:
#Date:
#Author:
#Email:
#Phonenumb:
#Copyright:
#------------------------------------------------
脚本结构:
解释器:#!/bin/shell,等
配置变量:自己定义的变量,A=123等
功能描述:以#开头来说明接下来执行语句的作用
执行命令:指令+参数,包括各种语句表达式等
脚本调试:
检测脚本中的语法错误
bash -n /PATH/TO/FILE.sh
调试执行
bash -x /PATH/TO/FILE.sh
脚本中默认不支持别名
尽可能用命令的绝对路径

变量介绍

	变量的作用:
数据暂存
参与运算
表示数据范围
强类型变量:
变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。
一般定义变量时必须指定类型、参与运算必须符合类型要求。
调用未声明变量会产生错误。
如 java,c#的变量
弱类型变量:
语言的运行时会隐式做数据类型转换。
无须指定类型,默认均为字符型。
参与运算会自动进行隐式类型转换。
变量无须事先定义可直接调用
如bash,php的变量
变量的命名规则:
不能使程序中的保留字,如if、for等。
只能使用数字、字母及下划线,且不能以数字开头。
需见名知义。
统一命名规则,即驼峰命名法
bash中的变量种类
根据变量的生效范围作为标准
本地变量: 生效范围为当前shell进程。对当前shell之外的其它shell 进程,包括当前shell的子shell 进程均无效。
环境变量: 生效范围为当前shell进程及其子进程。
局部变量: 生效范围为当前shell进程中某代码片断( 通常指函数)。
位置变量: $1, $2, ...来表示,用于让脚本在脚本代码中通过调用命令行传递给它的参数,大于9的数,就应该加大括号:${10}
特殊变量: $?, $0, $*, $@, $#,$$
本地变量
变量赋值:
name=value
引用value:
直接字串: name=“root"
变量引用: name="$USER"
命令引用: name=` COMMAND `; name =$(COMMAND)
变量引用:
${name}
$name
" " : 弱引用,其中的变量引用会被替换为变量值
' ': 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
${name[$i]} i是变量,name[$i]也是变量
' ':最傻的那个 ;" ":中间傻 ; ` `:聪明
显示已定义的所有变量:
set
删除变量:
unset name
环境变量
变量声明和赋值:
export name=VALUE
declare -x name=VALUE
变量引用:
$name, ${name},"$name"(尽量用带括和带双引号的)
显示所有环境变量:
env
printenv
bash内建的环境变量
PATH,SHELL,USER,UID,HOME,PWD,SHLVL,LANG,MAIL,HOSTNAME,HISTSIZE,—
只读变量
只能声明,但不能修改和删除。
声明只读变量:
readonly name
declare -r name
先赋值再声明或者是声明赋值一起做,不然,声明过后就不能再赋值了
查看只读变量:
readonly –p
位置变量
在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, ... : 对应第1 、第2 等参数,是脚本后面跟着的参数,且9以后需要加大括号:${10}
shift [n] 可以更换位置
$0: 命令本身
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@与$* 只在被双引号包起来的时候才会有差异
set - - 清空所有位置变量
涉及到位置参数,脚本前面放置这个
[ $# -lt 1 ] && echo "Usage:`basename $0` arg1... " && exit 10 转换变量类型
可以使用declare或者typeset来转换变量类型
[root@localhost ~]# a=1;b=2;c=a+b;
[root@localhost ~]# echo $c
a+b
[root@localhost ~]# typeset -i a;typeset -i b;typeset -i c;
[root@localhost ~]# a=1;b=2;c=a+b;
[root@localhost ~]# echo $c

退出状态

	进程使用退出状态来报告成功或失败
0 代表成功,1 -255 代表失败
$?变量保存最近的命令退出状态
示例:
ping -c1 -W1 hostdown &> /dev/null
echo $?
bash 自定义退出状态码
exit [n]:自定义退出状态码
注意:
脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit 命令后面的数字
如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

算术运算

	help let
let arg [arg ...]
运算
+, -, *, /, % 取模(取余), ** (乘方)
注:乘法符号有些场景中需要转义 , 如*
增强型赋值:
+=, -=, *=, /=, %=
自增和自减:
let var+=1
let var++
let var-=1
let var--
实现算术运算
let var= 算术表达式
var=$[ 算术表达式]
var=$(( 算术表达式))
var=$(expr arg1 arg2 arg3 ...) ##expr判断后面的变量是否为整数,但不能为0。
declare –i var = 数值
echo ‘ 算术表达式’ | bc
bc
$RANDOM (0-32767) ##bash内建的随机数生成器
echo $[$RANDOM%50] ##0-49 之间随机数

逻辑运算

	true和false
1, 0
输出0为假
设置空为假
设置0为真
与:
1 与 1 = 1
1 与 0 = 0
0 与 1 = 0
0 与 0 = 0
或:
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0
非:!
! 1 = 0
! 0 = 1
短路运算
短路与
第一个为0 ,结果必定为0
第一个为1 ,第二个必须要参与运算
短路或
第一个为1 ,结果必定为1
第一个为0 ,第二个必须要参与运算 异或:^
异或的两个值, 相同为假,不同为真
数值交换:

条件性执行操作符:&&和||

	根据退出状态而定,命令可以有条件地运行。
&& 代表条件性的and、then,与
|| 代表条件性的or、else,或

条件测试:

	判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程
评估布尔声明,以便用在条件性执行中
若真,则返回0
若假,则返回1
测试命令和表达式
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]] ##支持扩展的正则表达式算法
注意:
EXPRESSION 前后必须有空白字符
多测试在使用
![](http://images2017.cnblogs.com/blog/1250974/201802/1250974-20180207000632435-1219260200.png) 数值测试:
-gt (great than) 大于
-ge (great equal) 大于等于
-eq (equal) 等于
-ne (not equal) 不等于
-lt (lower than) 小于
-le (lower equal) 小于等于
字符串测试:
== 等于
> ascii 码大于ascii码
< 小于
!= 不等于
=~ 左侧字符串能够被右侧的PATTERN所匹配
-z "STRING“ 字符串为空,空为真,不空为假
-n "STRING“ 字符串不空,不空为真,空为假
注意:
此表达式一般用于[[ ]] 中;扩展的正则表达式。
用于字符串比较时,用到的操作数STRING都应该使用引号。
文件测试
存在为真,不存在为假
存在性和类别测试:
-a|-e FILE: 是否文件存在
-b FILE : 是否存在且为块设备文件
-c FILE : 是否存在且为字符设备文件
-d FILE : 是否存在且为目录文件
-f FILE : 是否存在且为普通文件
-h|-L FILE : 存在且为符号链接文件
-p FILE : 是否存在且为命名管道文件
-S FILE : 是否存在且为套接字文件
文件权限测试:
-r FILE : 是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
测试的是实际权限,例如root就有大多数权限
文件特殊权限测试:
-u FILE : 是否存在且拥有suid 权限
-g FILE : 是否存在且拥有sgid 权限
-k FILE : 是否存在且拥有sticky 权限
文件大小测试:
-s FILE: 是否存在且非空
文件是否打开:
-t fd: fd表示文件描述符是否已经打开且与某终端相关
-N FILE: 文件自从上一次被读取之后是否被修改过
-O FILE : 当前有效用户是否为文件属主
-G FILE : 当前有效用户是否为文件属组
双目测试:
FILE1 -ef FILE2: FILE1与FILE2 是否指向同一个设备上的相同inode
FILE1 -nt FILE2: FILE1是否新于FILE2 (mtime)
FILE1 -ot FILE2: FILE1是否旧于FILE2 组合测试
命令
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]]
表达式
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION 非
必须使用测试命令进行
示例:
[ -z “$HOSTNAME” -o $HOSTNAME "=="localhost.localdomain" ] && hostname shen
[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

括号的用法

	小括号()
(子进程),小括号是开子进程了,开子shell,小括号内值,只能在括号内用。
中括号[ ]
[表达式],用于测试
大括号{ }
{ cmd ; cmd ; …. ; }不会开子shell

参数导入:read

	使用read 来把输入值分配给一个或多个shell 变量。
使用read 从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个变量。
示例:
read -p “Enter a filename: “ FILE
read a b c <<< "xxx yyy zzz"

展开命令行的优先级

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

防参数属性扩展

	反斜线(\ )会使随后的字符按原意解释
$ echo Your cost: \$5.00
Your cost: $5.00
加引号来防止扩展
单引号(’ )防止所有扩展
双引号(” )也防止所有扩展,但是以下情况例外:
$ (美元符号)#变量扩展
` (反引号)#命令替换
\ (反斜线) #禁止单个字符扩展
! (叹号)#历史命令替换

$- 变量

	echo $-
himBH
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个历史命令

shell脚本-基础的更多相关文章

  1. 详细介绍Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  2. Linux shell脚本基础学习详细介绍(完整版)二

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

  3. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...

  4. Shell脚本基础学习

    Shell脚本基础学习 当你在类Unix机器上编程时, 或者参与大型项目如k8s等, 某些框架和软件的安装都是使用shell脚本写的. 学会基本的shell脚本使用, 让你走上人生巅峰, 才怪. 学会 ...

  5. 什么是Shell?Shell脚本基础知识详细介绍

    这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 ...

  6. shell脚本基础知识

    虽然现在能在Linux系统下生存,但是自觉效率太低,和高手有很大的差距. 这就是关于Linux的知识太过匮乏,有很多事情知道该怎么做,但是就是没法在Linux下实现,为了提升工作效率,必须要接触Lin ...

  7. shell脚本 基础应用

    变量分为普通变量可只读变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ...

  8. 模块一:shell 脚本基础

    一.shell脚本介绍 (一)脚本案例及介绍: #!/bin/bash LOG_DIR=/var/log ROOT_UID=0 if ["$UID -ne "$ROOT_UID&q ...

  9. shell脚本基础知识以及变量

    一.基础知识 1.shell脚本的格式注意事项 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)."#!/bin/bash" ...

随机推荐

  1. vuecli3.x config

    module.exports = { // 基本路径 baseUrl: process.env.NODE_ENV === 'production' ? '/' : '/', // 输出文件目录 out ...

  2. Python反射、异常处理

    反射 :字符串到对象属性的映射 hasattr(obj,string), 判断对象obj里面是否有叫string的字段或方法 getattr(obj,string) 获取obj对象里名叫string的 ...

  3. 日常操作之如何打开windows注册表

    1.打开注册表:第一步按“win+R”或者点击开始菜单,找到运行,在运行输入框里面输入“regedit”.

  4. Linux查看用户列表

    cat /etc/passwd 可以查看所有用户的列表w 可以查看当前活跃的用户列表cat /etc/group 查看用户组 groups 查看当前登录用户的组内成员groups gliethttp ...

  5. Django-REST_Framework 第三方登录

    DRF第三方登录,我们将使用第三方包实现!!! 1.首先安装 pip install social-auth-app-django 文档请看 https://python-social-auth.re ...

  6. 3.2.3.7 ERE 运算符的优先级

        在 ERE 里运算符的优先级和 BRE 一样.由高至低列出了 ERE 运算符的优先级.     运算符 含义 [..]  [= =]  [: :] 用于字符对应的方括号符号 \metachar ...

  7. Java Web学习总结(31)——全站HTTPS化SSL免费证书使用

    1 背景 谷歌从 2017 年起,Chrome 浏览器将也会把采用 HTTP 协议的网站标记为「不安全」网站:苹果从 2017 年 iOS App 将强制使用 HTTPS:在国内热火朝天的小程序也要求 ...

  8. image url to base64

    image url to base64 https://www.base64-image.de/ https://www.browserling.com/tools/image-to-base64 h ...

  9. 用XAMPP+Wordpress搭建个人博客

    http://biancheng.dnbcw.info/php/456308.html http://jingyan.baidu.com/article/f71d60376ba9571ab641d11 ...

  10. 遇到很多次,要注意区分service调用,本地用户调用这些区别

    WTSQueryUserToken返回1314   The WTSQueryUserToken function obtains the primary access token of the log ...