shell开发快速入门
Posted 顧棟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell开发快速入门相关的知识,希望对你有一定的参考价值。
shell开发快速入门
文章目录
初识bash
什么是shell
可以操作应用程序的接口都可以称为shell,但是狭义上也指命令行方面的软件。shell的功能只是提供用户操作系统的一个接口,因此这个shell需要可以调用其他软件。
bash 命令行界面的shell
目前bash是Linux的默认shell。
除了bash shell还有其他shell,系统支持的shell都会写到/etc/shell文件中。
用户的默认shell写在 /etc/passwd文件中。
bash shell的主要功能
-
历史命令
本次登录的历史命令,存储在内存之中,通过上下键查询。本次登录之前的任务,存储在
~/.bash_history
文件中。 -
命令补齐
在字母之后尝试按【Tab】键,会进行命令的提示和补全。或者文件的提示和补全。
-
命令别名设置
为常用命令设置别名,可以简化输入。执行
alias lm='ls -a'
后,输入lm
命令效果等同于ls -a
。默认本次shell有效。取消别名unalias lm
。 -
作业控制
job的前台 后台控制。后台任务可以不用担心【Ctrl】+C中断进程。
-
程序脚本
可以实现程序化的执行命令。bash script文件以.sh文件后缀名结尾。
shell的变量
变量的设置与显示
echo命令显示变量值
echo $变量名
unset取消变量
unset $变量名
变量的规则
- 变量名与变量值通过
=
连接 =
之间不能有空格符- 变量名由数字和英文组成,开头字符不能为数字
- 变量值中若含有空格符,需要通过双引号或者单引号连接
- 双引号中的特殊字符,保留特殊字符的原本特性,如$
- 单引号中的特殊字符,会变成一般字符(纯文本)
- 可以使用转义字符,将特殊字符变成一般字符
- 在一串命令中可以使用反单引号"`命令`“,或者”$(命令)"来优先执行,并将执行结果通过给其他命令。
- 若需要将变量的作用域扩大,使用export将变量变为环境变量。
- 大写变量为系统默认变量,自定义的变量请勿使用全大写。
- 可以使用unset来取消变量,是变量失效。
系统的默认变量可以使用
env
命令,查询出来。$
和?
是两个特殊变量。$代表当前shell的线程号,使用命令echo $$
可以输出。?
代表上一个命令的回传值,表明命令是否成功执行。0代表成功执行,其他值均代表错误。可以通过ehco $?
命令输出结果。
变量的作用域
【shell局部变量】【shell环境变量】【用户系统变量】
当启动一个shell时,操作系统会分配一块内存给shell使用,此内存的变量(shell环境变量)可以让子线程取用。
当父进程创建一个变量,此时变量是shell局部变量,在进行export变量时,会将自定义的变量写到上述的shell的内存中,此时变量升级为shell环境变量
当从父shell中加载另一个shell的时候,子shell会将父shell环境的变量所在的存储导入到自己的存储中。若父shell退出,则变量失效。
若开辟了一个新的远程连接shell,将无法读取另一个远程shell中的shell环境变量。若想其他远程连接shell可以共享变量,可以讲变量写入用户的~/.bash_profile
中,用户每次登录都会加载里面的数据。
变量的类型
变量的类型只有字符串类型(默认),整数类型,和数组类型,可以通过declare
或者typeset
来声明变量。
变量内容的变更
内容的删除,替换,截取
变量的长度:echo $#变量
变量设置方式 | 说 明 |
---|---|
$变量#关键字 | 若变量内容从头开始的数据符合”关键字“,则将符合的最短数据删除 |
$变量##关键字 | 若变量内容从头开始的数据符合”关键字“,则将符合的最长数据删除 |
$变量%关键字 | 若变量内容从尾向前的数据符合”关键字“,则将符合的最短数据删除 |
$变量%%关键字 | 若变量内容从尾向前的数据符合”关键字“,则将符合的最长数据删除 |
$变量/旧字符串/新字符串 | 若变量内容符合”旧字符串“,则第一个旧字符串会被新字符串替换 |
$变量//旧字符串/新字符串 | 若变量内容符合”旧字符串“,则全部个旧字符串会被新字符串替换 |
$变量:number | 从左往右 变量值的第number个字符截取到变量值的末尾 |
$变量:0-number 或者$变量: -number | 从变量值的倒数第number个字符开始截取到变量值的末尾 |
$变量:number:length | 从左往右 变量值的第number个字符开始,截取length个字符 |
$变量:0-number:length 或者$变量: -number:length | 从变量值的倒数第number个字符开始,截取length个字符 |
$变量:0-number1:-number2 | 从变量值的倒数第number1个字符开始截取变量值到末尾,再之前截取的结果基础上,截取最后的number2个字符。从Centos 7支持。 |
变量的根据str变量觉得变量var
变量设置方式 | str没有设置 | str为空字符串 | str已设置非空字符串 |
---|---|---|---|
var=$str-expr | var=expr | var= | var=$str |
var=$str:-expr | var=expr | var=expr | var=$str |
var=$str+expr | var= | var=expr | var=expr |
var=$str:+expr | var= | var= | var=expr |
var=$str=expr | str=expr var=expr | str=不变 var=expr | str=不变 var=$str |
var=$str:=expr | str=expr var=expr | str=expr var=expr | str=不变 var=$str |
var=$str?expr | expr输出值stderr | var= | var=str |
var=$str:?expr | expr输出值stderr | expr输出值stderr | var=str |
bash的环境配置文件
login shell 需要输入账号密码才能获取的bash
nolong shell 不需要输入账号密码才能获取的bash
login shell与non-login shell的加载配置文件是不一样的。
login shell的配置文件读取流程
所有用户(login shell)都会去读取/etc/profile
文件,这是一个整体环境的配置文件,在完成/etc/profile
的相关逻辑之后,会读取~/.bash_profile
配置文件,这是一个用户的个人配置文件,在这个配置文件读取中会读取~/.bashrc
文件的内容。这个配置文件~/.bashrc
比较特殊,在non-login shell的时候也会去读取。常规情况下,一些用户的配置建议可以写到~/.bashrc
这个文件中。
bash的通配符
符号 | 意义 |
---|---|
* | 代表0到无穷个任意字符 |
? | 代表一个任意字符 |
[] | 同样代表一个有一个在中括号内的字符(非任意字符) |
[-] | 若有减号在中括号内时,代表在编码顺序内的所有字符。例如[0-9]代表0-9之间的所有数字 |
[^] | 若中括号内的第一个字符为指数符号^,那表示反向选择,例如[^abc],代表一定有一个字符,只要非a,b,c的其他字符。 |
bash的特殊字符
符号 | 意义 |
---|---|
# | 批注符号,在脚本中作为注释。不执行 |
\\ | 转义符号,将特殊符号或者通配符转成一般字符 |
; | 连续命令执行分隔符 |
~ | 用户的主文件夹 |
$ | 使用变量的前导符 |
& | 作业控制,将命令变成后台执行 |
! | 逻辑意义上的非(not) |
/ | 目录符号 |
>,>> | 数据流重定向,输出方向,替换和追加 |
<,<< | 数据流重定向,输入方向 |
‘’ | 单引号,不具备变量置换功能 |
“” | 双引号,具备变量置换功能 |
`` | 命令优先执行。效果等同$() |
() | 在中间是子shell命令 |
在中间命令块的组合 | |
| | 管道,分隔两个管道命令 |
数据流重定向
数据流指命令执行过中数据传输的情况。
在执行一个命令的时候,可能会由文件读入数据,经过处理之后再将数据输出到文件或者屏幕。
标准输入(stdin):通过代码 0,符号使用<或者<<控制。
标准输出(stdout):命令执行所回传的正确信息。通过代码 1,符号使用>或者>>控制。
标准错误输出(stderr):命令执行失败后回传的错误信息。通过代码 2,符号使用>或者>>控制。
1>
:以覆盖的方式将正确的数据输出到指定的文件或者设备上;1>>
:以追加的方式将正确的数据输出到指定的文件或者设备上;2>
:以覆盖的方式将错误的数据输出到指定的文件或者设备上;2>>
:以追加的方式将错误的数据输出到指定的文件或者设备上;
/dev/null
垃圾黑洞设备,这个可以忽略信息,吃掉任何导向这个设备的信息。
2> /dev/null
:错误信息忽略
> list1 2> list2
:正确信息输出到list1,错误信息输出到list2
> list 2>&1
:将正确信息和错误信息都写到list中,特殊写法2>&1
cat file1 < file2
:将file2的内容写到file1中
cat file << “eof”
:输入eof会终止输入。当在键盘上输入关键字eof时,会终止此次对file文件的内容输入。
双向重定向
当通过 >或>> 将数据流传送给文件或设备,除非重新读取该文件或设备,否则无法继续使用这个数据流。若我们需要在处理过程中将数据的部分信息村夏利,可以使用双向重定向(tee命令)。他可以同时将数据输出到文件和屏幕。
如何简单的一次输入多重命令
借助 ;
,&&
,||
。
cmd1; cmd2
:命令1和命令2之间没有命令相关性,在命令1执行后会执行命令2。
cmd1&& cmd2
:若命令1执行完毕且正确,则再去执行命令2;若命令1执行完毕且失败,则不再执行命令2。
cmd1|| cmd2
:若命令1执行完毕且正确,则不再执行命令2;若命令1执行完毕且失败,则再执行命令2。
命令分类
管道命令
什么是管道命令,有什么功能,有什么使用注意点
管道命令|
,仅能处理经由前面一个命令传来的正确信息(standard output),对错误信息(standard error)并没有处理能力。
cmd1 | cmd2
:命令2会对cmd1命令的标准正确输出继续处理。
使用管道命令的注意点:
-
界定符号
|
后面的命令必须要能够接受标准输入()的数据才行,这样的命令才是管道命令。 -
管道命令仅仅处理经由前面一个命令传来的正确信息(standard output),对错误信息(standard error)并没有处理能力。
-
在管道命令的使用当中会借助减号
-
来替代stdin和stdouttar -cvf - /home | tar -xvf - # 其中并非将/home里面的文件打包成文件,而是传送到stdout中(-代替了),经过管道后将数据流传给后面的解压命令 后面的-就是接受了前面stdout。
参数代换:xargs
很多命令其实并不支持管理命令,这样需要使用xargs来提供该命令引用standard input之用。
find logs | ls -l
# 会将当前目录下的所有信息展示出来,这不是我们想要的
find logs | xargs ls -l
logs:
总用量 8
-rw-r--r--. 1 root root 886 8月 17 19:25 CLUSTER_INSTALL_2022-08-17.log
-rw-r--r--. 1 root root 1607 8月 17 19:25 NODE_INSTALL_2022-08-17.log
选取命令
以行为单位,截取出需要的部分
cut
:以行为单位,截取出需要的部分grep
:按行分析数据,获取包含数据的那一行
排序命令
+ sort
:用来排序的命令
wc
:计数命令uniq
:去重命令
字符转换命令
tr
:可以删除一段信息中的部分数据或者替换col
:将【tab】按键替换为对等的空格键join
:可以讲拥有相同数据的行合并成一行paste
:直接合并两行为一行,中间以【tab】按键分隔expand
:将【tab】按键转成空格键,一般一个【tab】按键转成8个空格键
分割命令
split
:将一个文件切割成多个小文件
数据处理命令
awk
:将一行数据切分为多个字段的方式来处理数据。更适合处理小型的数据处理。seq
:作用于一整行数据的处理,将数据进行替换,删除,新增,选取特定行,修改行中数据的功能
shell中的正则
特殊字符
语系配置不同导致英文和数字的选取问题,需要记住正则中的特殊符号,不受语系配置影响。
特殊字符 | 代表意义 |
---|---|
[:alnum:] | 代表英文大小写字符以及数字,即0-9,A-Z,a-z |
[:alpha:] | 代表任何英文的大小写字符,即A-Z,a-z |
[:blank:] | 代表空格键与Tab键 |
[:cntrl:] | 代表键盘上的控制按键,即CR,LF,Tab,Del等 |
[:digit:] | 代表数字,即0-9 |
[:graph:] | 代表除了空格键与Tab键外的其他所有按键 |
[:lower:] | 代表小写字符,即a-z |
[:print:] | 代表任何可以被打印出来的字符 |
[:punct:] | 代表标点符号,即" ’ ? ; : # $ |
[:upper:] | 代表英文的大写字符,即A-Z |
[:space:] | 代表任何会产生空格的只读,包括空格键 tab键 CR等 |
[:xdigit:] | 代表十六进制的数字类型,即0-9 A-F a-f的数字与字符 |
基础正则表达式
RE字符 | 意义与范例 |
---|---|
^Word | 待查询的字符串(Word)在行首 |
Word$ | 待查询的字符串(Word)在行尾 |
. | 代表一定有一个任意的字符 |
\\ | 转义字符 |
* | 重复0到无穷个的前字符 |
[list] | 从字符集的RE字符(list)中找到想要的字符 |
[n1-n2] | 从字符集的RE字符(n1-n2)中找到想要的字符,n1-n2之间是连续的值,具体跟语系设置相关 |
[^list] | 从字符集的RE字符(list)中找不到的字符或范围 |
\\n.m\\ | 连续n到m个的前一个RE字符。若为\\n\\ ,代表连续n个前一个RE字符。若\\n,\\ 代表连续n个以上的前一个RE字符。 |
扩展正则表达式
RE字符 | 意义与范例 |
---|---|
+ | 重复1个或1个以上的前一个RE字符 |
? | 0个或者1个的前一个RE字符 |
| | 用或的方式找 |
( ) | 找出组的字符串,()中是组合 |
( ) + | 多个重复组的判别 |
shell 脚本
程序化脚本,利用shell的功能写一个程序,达到我们的处理能力。脚本是一个以’.sh’为文件后缀名的纯文本文件。shell脚本编写的注意事项
- 命令的执行时从上至下,从左而右的分析与执行
- 命令的执行的时候,命令、参数之间多个空白会被忽略
- 空白行会被忽略,tab键输入的空白,也被视为空格键
- 如果读取到一个Enter符号(CR)换行,就来时尝试执行该行(或该串)命令
- 若一行内容太多可以使用
\\[enter]
扩展至下一行 #
用来进行注释
脚本format
#!/bin/bash
# Author : Donny
# History :
# 2022/08/16 Version1 第一次发布的内容
# Program : 脚本的功能说明
# 例如:sh es1.7_cluster_install.sh /opt/gudong sit true 222
####################################################################################
# 程序主体
echo -e "Hello World!"
# 告知执行结果
exit 0
- 第一行声明脚本使用的shell
- 脚本作者
- 脚本发布历史
- 程序的功能说明
- 主要的程序部分
- 告知执行结果 成功用0 错误用其他
表达式判断
-
通过test命令的测试功能判断
-
判断符
[]
来判断[ "Donny" == "$name" ]
使用注意点:
- 中括号内的每个组件都需要使用空格分隔
- 中括号内的变量,最好都使用双引号括起来
- 中括号内的常量,最好最好都使用双引号或单引号括起来
脚本的默认变量
$0
:代表执行脚本的文件名
$number
:代表第n个参数,例如$1代表第一个参数
$#
:代表参数的个数
$@
:代表"$1"、“$2”、“$3”,每个变量都是独立的
$*
:代表““$1c$2c$3””,其中c为分隔符,默认是空白键。
shift
键会造成参数的偏移,就是删除前面的变量,将后面的变量前移
shift默认偏移一个变量 shift number
就是偏移number个变量
条件判断语句
if else语句
简单的判断条件,若有多个条件可以使用中括号隔开,多个中括号之间可以用&&
或||
隔开,&&
代表and
,||
代表or
。
Shell 脚本是用户使用Linux的桥梁-快速入门