shell脚本基础

目录

前言

一、概述

(一)、shell脚本基础概念

(二)、shell的类型

二、Shell变量

(一)、组成

1.变量名

2.变量值

(二)、类型

1.系统内置变量(环境变量)

2.自定义变量

3.预定义变量

4.位置变量

5.作用域

​6.shell中的字符串

三、运算符

(一)、数学运算

(二)、比较运算

1.逻辑运算符

2.条件测试

3.字符串比较

4.数值比较

5.文件比较

四、shell脚本

(一)、shell脚本编写规范

(二)、shell运行规则

(三)、shell脚本运行追踪

总结



前言

shell是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Shell属于内置的脚本,程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理)语法简单,代码写起来比较轻松,简单易学。

一、概述

(一)、shell脚本基础概念

脚本就是将手动一次性执行的命令进行规范且自动化

(二)、shell的类型

shell 命令解释环境

类型有

sh

ash

bsh

csh

bash

tcsh

dsh

zsh

在Linux系统中

文件名**.sh** .sh 是linux下bash shell 的默认后缀

查看系统中支持的shell

cat /etc/shells

查看系统默认shell

echo $SHELL

二、Shell变量

(一)、组成

1.变量名

不会变化

声明规范

不能是数字或数字开头

以_或字母开头

变量名中不能包含特殊字符

声明方法

驼峰式 userName

双驼峰 UserName

shell写法

user_name

username

USERNAME

2.变量值

不断变化

数字、字符

(二)、类型

1.系统内置变量(环境变量)

这种变量中主要保存的是和系统操作环境相关的数据,一般对系统起作用的环境变量的变量名是系统预先设定好的。

env可在/etc/profile文件中修改

查看环境变量

echo $PATH

显示当前环境变量的值

echo $LANG

表示系统的默认语言环境为美式英语(English, United States)并使用UTF-8编码

查看当前的区域设置

locale

查看远程连接

echo $SSH_CONNECTION

2.自定义变量

这种变量是最常见的变量,由用户自由定义变量名和变量的值。

varName=varValue

等号两边不能有空格

字符串

shell中可以不使用引号

当包含有空格时,需要使用引号

引号的用法

|---------|--------|
| 不会引用变量值 | 单引号 ' |
| 会应用变量值 | 双引号 " |
| 引用命令结果 | 反撇号 ` |
| $(命令) | 应用场景较多 |

3.预定义变量

是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

|-------|------------------|
| 0 | 脚本本身的名称 | | # | 脚本后参数的个数 |
| \* | 脚本运行时参数的内容(整体输出) | | @ | 脚本运行时参数的内容(逐个输出) |
| $? | 脚本运行完毕后的返回值 |
| 默认情况大 | 0 成功 |
| | 非0 失败 |

一般情况下失败为1,特殊的失败

4.位置变量

这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。

脚本后参数所在的位置

$1

...

$9

5.作用域

输出 echo $varName

默认变量只在当前shell下生效

若要在当前及其子shell下生效,需要声明为全局变量(export)


6.shell中的字符串

string

1)获得字符串的长度

语法: ${#StringName}

2)字符串取子串

语法: ${#StringName:position:lenght}

注意:lenght没有定义时,一直取到字符串的结尾!

3)字符串的截取

a.从左至右截取最后一个匹配字符串string之后的所有字符串

语法: ${StringName##*string}

b.从左至右截取第一个匹配字符串string之后的所有字符串

语法: ${StringName#*string}

c.从右至左截取最后一个匹配字符串string之后的所有字符串

语法: ${StringName%%string*}

d.从右至左截取第一个匹配字符串string之后的所有字符串

语法: ${StringName%string*}

4)字符串的拼接

语法: StringName3={StingName1}{StringName2}

5)字符串替换:

语法: ${StringName/OldString/NewString}

三、运算符

(一)、数学运算

|------------|---------------------|
| + - * / % | * 作为乘号时需要加转义符为\* |
| 运算方法 | |
| expr | expr a + b |
| ((a+b)) | echo ((a+b)) |
| \[a+b\] | echo [a+b] |
| 注意 | shell不支持浮点数的显示 |

|-----|-------|
| \r | 回车符 |
| \d | 垂直制表符 |
| \v | 水平制表符 |

(二)、比较运算

1.数值比较

|-----|------|
| -eq | 等于 |
| -ne | 不等于 |
| -lt | 小于 |
| -le | 小于等于 |
| -gt | 大于 |
| -ge | 大于等于 |

用test测试

2.文件比较

|----|-----------|
| -e | 文件或目录是否存在 |
| -f | 是否为文件 |
| -d | 是否为目录 |
| -r | 判断文件是否可读 |
| -w | 判断文件是否可写 |
| -x | 判断文件是否可执行 |

3.字符串比较

|------|--------|
| = | 字符串一致 |
| != | 字符串不一致 |
| -z | 字符串为空 |
| ! -z | 字符串不为空 |

4.逻辑运算符

|------|----|--------------|
| && | | 并且,有假则假,全真为真 |
| || | | 或者,有真则真,全假为假 |
| ! | 取反 | 有真则假,有假则真 |

5.条件测试

|------|------------------------------|--------------|
| && | [ a -ne b ] && echo OK | 条件 && 输出结果 |
| | | 条件为真输出 |
| || | [ a -ne b ] || echo OK | 条件 || 输出结果 |
| | | 条件为假输出 |

四、shell脚本

(一)、shell脚本编写规范

|-----|-------------|
| 第一行 | #!/bin/bash |
| 第二行 | #脚本的说明 |
| 第三行 | 脚本正文 |

(二)、shell运行规则

|-------|--------------------|
| 没有x权限 | bash 脚本所在路径/脚本文件 |
| | source 脚本所在路径/脚本文件 |
| | .(点)脚本所在路径/脚本文件 |
| 有x权限 | .(点)/脚本文件 |
| | 脚本绝对路径/脚本文件 |

不打断会一直查看

(三)、shell脚本运行追踪

shell脚本运行追踪bash -x 脚本所在路径/脚本文件

\[RANDOM%100]返回100内随机数

seq 1 10返回1到10 的连续数字

{1..10}返回1到10 的连续数字

seq 1.1 10.1返回1.1 2.1 3.1.... 10.1

read -p "提示语" 变量名读取键盘输入并赋值给变量名


总结

今天的任务量有些重,但知识点是看懂和编辑Shell脚本的基础,需要花费时间进行反复背记,加油吧!

相关推荐
不甘平凡--liang19 分钟前
Linux Nginx安装部署、注册服务
linux·运维·服务器
小妖6661 小时前
linux (centos) 的 nodejs 安装全局包后使用命令无效
linux·运维·centos
不穿格子衬衫2 小时前
感受命令行界面的魅力——Linux环境下基础开发工具的使用
linux·运维·centos
誓约酱2 小时前
linux 下消息队列
linux·运维·服务器·c语言·c++
獨枭2 小时前
Ubuntu 优化 Vim 指南
linux·ubuntu·vim
阿常呓语2 小时前
Jenkins服务搭建
运维·jenkins
一匹电信狗2 小时前
【Linux我做主】基础命令完全指南下篇
linux·运维·服务器·c++·开源·centos·unix
wanhengidc3 小时前
海外服务器的网络带宽该如何进行选择?
运维·服务器
小安同学iter3 小时前
SpringMVC(七)数据校验+VO++脱敏
java·服务器·spring·java-ee·intellij-idea
嵌入式-老费4 小时前
Linux上位机开发实战(qt编译之谜)
linux·运维·服务器