加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

UNIX Shell数组 shell基础认识

发布时间:2022-11-01 14:31:19 所属栏目:Unix 来源:互联网
导读: 目录
shell的初识
shell是命令,又是一门程序设计语言,有变量、函数、逻辑控制语句
echo $SHELL 输出当前系统环境使用的shell解析器
linux系统默认shell解析器为 /bin/bash
shell脚本是

目录

shell的初识

shell是命令,又是一门程序设计语言,有变量、函数、逻辑控制语句

echo $SHELL 输出当前系统环境使用的shell解析器

linux系统默认shell解析器为 /bin/bash

shell脚本是一个文本文件,里面可以编写shell命令或编程,形成一个可重复执行的脚本文件

提高Linux系统的管理效率(批操作)

shell脚本文件的编写规范:

文件后缀名常用 .sh

文件首行需要设置该文件的shell解析器类型

#! shell解析器类型(/bin/bash)

单行注释:#注释内容

多行注释::shell文件的三种执行方式

1、sh解析器执行

sh 脚本文件路径

2、bash解析器执行

bash 脚本文件路径

3、文件自己执行(需要文件有执行权限,而sh和bash解析器不需要)

脚本文件路径(当前目录下的文件仍需为 ./文件名)

shell变量:

变量用于存储管理临时的数据,都存在运行内存中

环境变量:

1、系统环境变量:shell环境加载全局配置文件中的变量共享给所有shell程序使用

env指令:查看当前shell环境的系统环境变量

set指令:查看当前shell环境的系统环境变量+自定义变量+函数

常用系统环境变量:

PATH:命令的搜索路径

HISTFILE:用户历史操作指令列表所在路径

LANG:系统语言环境

2、个人环境变量:shell环境加载个人配置文件中的变量给当前用户的shell程序使用

自定义变量:

自定义局部变量:只能在一个脚本内部使用的变量

定义语法:变量名=变量值

规则:1、名称可有字母、数字、下划线,但不能以数字开头

2、= 号左右俩边不能有空格

3、在bash解析器中,默认为字符串类型,不能进行数值运算

4、变量值存在空格,需用 “ ”括起来

5、不能用shell的关键字做变量名

输出:echo $变量名,可用 {}进行字符拼接

删除:unset 变量名

自定义常量:只可以读的变量,不可修改

定义语法:readonly 变量名

自定义全局变量:

父子shell环境:A.sh中调用了B.sh,则A.sh为B.sh的父shell环境,父shell环境中定义的全局变量,可在子shell环境中使用

定义语法:export 变量名=变量值

修改:变量名=新的值

查找:${变量名}

删除:unset 变量名

特殊符号变量:

$n:用于接收脚本文件执行时传入的参数

$0:当前脚本文件的名称

$1-$9:表示第一个到第九个传入的参数

第十个参数以上需加 { },${数字}

脚本文件传入参数的方法:sh 脚本文件 传入参数1 传入参数2 ...

$#:获取脚本文件传入参数个数

$*和$@:获取所有传入参数

1、不加 " ",俩者无区别,都是将所有参数拼成一个字符串

2、加 " ","$@":表示一组传入参数列表对象,每个参数都是单独的字符串

$?:获取上一个shell命令的退出状态码,或函数的返回值

一般来说,返回0表示成功,非0失败

$$:获取当前shell环境的进程ID号

shell环境变量深入: 系统环境变量全局配置文件 /etc/profile

可在配置文件中增删系统环境全局变量(export)

需source(重载)后才会生效

unset删除(直接删除文件内的声明语句无法直接生效,需要再次关开机后重新加载shell环境)

shell工作环境分类:

交互式和非交互式

交互式:用户实时输入命令操作,shell立即反馈

非交互式:shell直接进行一系列操作,不需要用户参与,最后反馈结果

登录和非登录式:

登录:需要用户名和密码进行登录操作的shell环境

非登录式:不需要用户名和密码进行登录操作的shell环境 或 执行脚本文件

不同的登录模式加载环境变量的流程不同:

简单来说:非登录的shell工作环境,不会加载 /etc/profile文件

可使用 echo $0 来识别当前shell的登录环境

输出 -bash(-su):当前为登录式shell环境

输出 bash:表示当前为非登录式shell环境

工作环境之间的切换:

su 用户名 -l (--login):加载shell登录环境

su 用户名 : 加载shell非登录环境

bash:切换到非登录环境

bash -l(--login)脚本文件 :先加载shell登录环境,在执行脚本文件

sh -l(--login)脚本文件:先加载shell登录环境,在执行脚本文件

shell字符串变量: 使用格式:

单引号:无法解析变量,直接原样输出

双引号:可以解析变量,且可以包含空格、子双引号(需转义)

echo "双引号 \" 子双引号 \" "

无引号:可以解析变量,但有变量要解析时,则整个字符串不能有空格

获取长度:

${#字符串变量名}

拼接方式:

无符号拼接: 拼接字符串中间不能存在空格

新字符串=字符串1字符串2

有符号拼接:允许存在空格和其它字符

新字符串=" 字符串1 字符串2"

混合拼接:不使用 " "也能进行空格拼接,但需要借助echo

截取:

${变量名:start:lenth}:从左侧start位置(0开始数)开始,向右截取lenth长度字符

${变量名:start}:从左侧start位置(0开始数)开始,向右截取剩余全部字符

${变量名:0-start:lenth}:从右侧strat位置(1开始数)开始,向左截取lenth长度字符

${变量名:0-start}:从右侧start位置(1开始数)开始,向左截取剩余全部字符

${变量名#*字符C}:截取从左侧开始第一次出现字符C位置的右侧剩余字符

${变量名##*字符C}:截取从左侧开始最后一次出现字符C位置的右侧剩余字符

${变量名%字符C*}:截取从右侧开始第一次出现字符C位置的左侧剩余字符

${变量名%%字符C*}:截取从右侧开始最后一次出现字符C位置的左侧剩余字符

索引数组: 定义:()表示数字,数组元素用空格隔开

数组名称=(元素1 元素2 ...)

数组名称=([索引下标]=元素1 [索引下标]=元素2 ...)

=左右俩侧不能存在空格

PS:不能通过此方法创建关联数组(key-value)

获取:

${数组名[索引]}:该索引对应的数组元素

${数组名[*]} 或 ${数组名[@]}:获取数组全部元素

${#数组名[*]} 或 ${#数组名[@]}:获取数组的长度或元素个数

${#数组名[索引]}:该索引对应的数组元素的长度

拼接:同定义创建

新数组名称=(数组1 数组2):

删除:unset

unset 数组名[索引]:删除指定元素

unset 数组名:删除整个数组

shell内置命令:

由shell自身提供,不是系统文件中的可执行脚本文件

查看命令的类型:type 命令

内置:相当于函数调用,效率高

脚本文件:启动新进程,磁盘I/O操作,进程上下文切换,效率低

alias:设置别名

alias指令:查看当前环境下的别名列表

alias 别名="命令":给命令设置别名

unalias:别名 :删除指定别名

unalias -a:删除所有别名

PS:仅临时生效,想永久生效需修改配置文件

echo:输出字符串,默认换行

echo 字符串:默认换行输出

echo -n 字符串:不换行输出

echo -e 字符串:解析转义字符

echo -e 字符串\c:解析\c,清楚结尾的换行符,使不换行输出

read:读取数据

read:不提供变量名,则最后一个输入数据存储在环境变量 $REPLY中

read 变量名:读取数据存入指定变量中

操作选项:

-n 数字X:限制读取X个字符

-p "提示信息":关于输入的提示信息

-s:静默输入,不将输入内容显示出来(eg:密码输入)

-t 限制输入时间T(单位秒):设置输入时间,超过时间T会输入失败

exit:退出,并返回状态码

exit:默认正确退出,状态码为0

exit: 非零数字X:错误退出,返回状态码X

可通过状态码,判断操作执行失败的原因

declare:声明变量、设置变量类型

declare 操作选项 变量名=变量值

操作选项:

-:指定变量类型

+:取消变量类型

a:普通的索引数组

索引数组名=([索引下标]=值1 [索引下标]=值2 ...) 索引下标不能为字符串

A:关联数组

关联数组名=([字符串key1]=值1 [字符串key2]=值2 ...

r:自读变量 (readonly)

x:全局变量 (export)

i:整形变量 (int)

f:函数变量

shell运算符: 算数运算符: expr命令: 求值表达式

加减乘除:(只能整形运算)

语法:expr 运算符表达式 (表达式各元素需要用空格隔开)

将计算结果赋值给新变量:新变量名=expr `运算符表达式` (此处` `为反引号)

+:加expr1 + 1

-:减expr 3 - 1

*:乘expr 2 \* 3 (乘需进行转义)

/:除 expr 4 / 2

%:取余 expr 4%2

=:赋值 expr $a=$b

若运用了()也需要转义 \( \)

比较运算符:

整数比较运算符:只可以比较整数

语法:[ 数值1 操作选项 数组2 ](注意空格)

操作选项:

-eq:比较俩个数是否相等,等返回0,不等返回1

-ne:比较俩个数是否不相等,不等返回0,等返回1

-gt:比较数值1是否大于数值2,大返回0,不大返回1

-lt:比较数值1是否小于数值2,小返回0,不小返回1

-ge:比较数值1是否大于等于数值2,是返回0,否返回1

-le:比较数值1是否小于等于数值2,是返回0,否返回1

语法:((数值1操作选项数值2))(不要空格隔开)

另一种语法格式,效果一致

操作选项:

=、==、!=

字符串比较运算符:可以比较数字字符与字符串

使用 [ 字符串1 操作选项 字符串2 ] 或 [[ $字符串1 操作选项 $字符串2 ]]

==或=:判断是否相等,相等返回0,不等返回1

!=:判断是否不等,不等返回0,等返回1

:比较左侧字符串或数字是否大于右侧,大于返回0,不大于返回1

PS:字符串比较符不存在>= 或 ,在使用 [ ] 时,需转义,[ \< ] [ \> ],而 [[ ]]不用

只能使用 [ ]:

-Z:判断字符串长度是否为0,是返回0,不是返回1 [ -Z $字符串 ]

-n:判断字符串长度是否不为0,是返回0UNIX Shell数组,不是返回1 [ -n $字符串 ]

$:判断字符串是否为空,是返回0,不是返回1 [ $字符串 ]

[[ ]]和 [ ]的区别:

1、字符分隔(wordspliting):

[ ]会将有空格分隔的字符串分割成多个字符

2、部分操作选项需要转义 \

布尔运算符:只能使用 [ ]

只能使用 [ ] 或搭配 test指令使用

!:取反[ ! 表达式]

-o:或 [ 表达式1 -o 表达式2 ]

-a:与 [ 表达式1 -a 表达式2 ]

逻辑运算符:

&&:逻辑与 [[ 表达式1 && 表达式2 ]]

||:逻辑或 [[ 表达式1 || 表达式2 ]]

!:逻辑非 [[ ! 表达式 ]]

PS:&&和 || 可以使用 [[ ]] 和 (( ))

而 !可以使用 [[ ]] 和 [ ],不能使用 (( ))

文件测试运算符:检查文件

文件类型:

-:普通文件

d:文件夹(目录文件)

l:链接文件(eg:快捷键)

b:块设备文件

c:字符设备文件

p:管道文件

文件属性检测:[ 操作选项 $记录文件路径的变量] 或 [ 操作选项 文件路径 ]

-f:是否是普通文件,是返回0,不是返回1

-d:是否是文件夹(目录文件),是返回0,不是返回1

-r:是否有读权限,是返回0,不是返回1

-w:是否有写权限,是返回0,不是返回1

-x:是否有执行权限,是返回0,不是返回1

-s:是否为空,是返回0,不是返回1

-e:是否存在,是返回0,不是返回1

-nt:文件1是否比文件2新,是返回0,不是返回1[ 文件1路径 -nt 文件2路径]

-ot:文件1是否比文件2老,是返回0,不是返回1[ 文件1路径 -ot 文件2路径 ]

按照文件最近修改时间判断

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!