shell的操作

shell

shell定义

在计算机科学中,Shell就是一个命令解释器。
shell是位于操作系统和应用程序之间,是他们二者最主要的接口,shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。

脚本

shell脚本

当可执行的Linux命令或语句不在命令行状态下执行,而是通过一个文件执行时,我们称文件为shell脚本。

脚本实践

# 获取ip地址信息
ifconfig eth0 | grep -w inet | awk '{print $2}' | xargs echo "IP: "
# 获取掩码地址信息
ifconfig eth0 | grep -w inet | awk '{print $4}' | xargs echo "NetMask: "
# 获取广播地址信息
ifconfig eth0 | grep -w inet | awk '{print $6}' | xargs echo "Broadcast: "

脚本规范

1、脚本命名要有意义,文件后缀是.sh
2、脚本文件首行是而且必须是脚本解释器
 #!/bin/bash
3、脚本文件解释器后面要有脚本的基本信息等内容
 脚本文件中尽量不用中文注释;
 尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
 常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等
4、脚本文件常见执行方式:bash 脚本名
5、脚本内容执行:从上到下,依次执行
6、代码书写优秀习惯;
    1)成对内容的一次性写出来,防止遗漏。
如:()、{}、[]、''、``、""
    2)[]中括号两端要有空格,书写时即可留出空格[    ],然后再退格书写内容。
    3)流程控制语句一次性书写完,再添加内容
7、通过缩进让代码易读;(即该有空格的地方就要有空格)

shell变量

变量的本质

变量的本质其实就是 通过一个名称帮助程序快速找到内存中具体数据的地址。
 - 变量说白了就是指向xx值。

变量的使用

变量存在的意义是,脚本文件执行的时候,能够让脚本逻辑不变化的前提下,可以根据实际的数据进行相同逻辑的处理,从而满足当前业务需求。

变量定义

变量定义

变量包括三部分:
 变量名 - 不变的
 变量值 - 变化的
 赋值动作 - 变量名指向变量值
表现样式:
 变量名=变量值
 基本格式
 变量名=变量值
注意:
 = 两侧不允许有空格

示例

查看一个空值变量名
[root@rocky10 ~]# echo $myname
定制变量实践
[root@rocky10 ~]# myname=shuji
[root@rocky10 ~]# echo $myname
shuji

变量移除

基本格式
 unset 变量名

示例

查看刚才定制的变量名
[root@rocky10 ~]# echo $myname
shuji
移除变量名
[root@rocky10 ~]# unset myname
[root@rocky10 ~]# echo $myname

变量分类

本地变量 变量名仅仅在当前终端有效 
   - 立刻生效
    全局变量 变量名在当前操作系统的所有终端都有效,
   - 往往是以文件方式实现,以终端样式实现的效果不太明显
   - 需要重新加载文件后生效
    shell内置变量 shell解析器内部的一些功能参数变量

变量查看

查看默认的shell类型
[root@rocky10 ~]# echo $SHELL
/bin/bash

本地变量

本地变量

所谓的本地变量就是:在当前系统的某个环境下才能生效的变量,作用范围小

变量分类

本地变量按照变量值的生成方式包含两种:
 普通变量:
 自定义变量名和变量值
 命令变量:
 自定义变量名,而变量值是通过一条命令获取的

普通变量

变量分类

所谓的本地变量就是:在当前系统的某个环境下才能生效的变量,作用范围小。本地变量按照变量值的生成方式
包含两种:
 普通变量:
 自定义变量名和变量值
 命令变量:
 自定义变量名,而变量值是通过一条命令获取的

变量定义

查看默认的空值变量
[root@rocky10 ~]# echo $name
方法1设定变量
[root@rocky10 ~]# name=shuji
[root@rocky10 ~]# echo $name
shuji
方法2设定变量
[root@rocky10 ~]# name='shuji1'
[root@rocky10 ~]# echo $name
shuji1
方法3设定变量
[root@rocky10 ~]# name="shuji2"
[root@rocky10 ~]# echo $name
shuji2
清理变量
[root@rocky10 ~]# unset name

命令变量

基本格式

定义方式一:
 变量名=`命令`
    注意:
    ` 是反引号
定义方式二:
 变量名=$(命令)
执行流程:
 1、执行 ` 或者 $() 范围内的命令
 2、将命令执行后的结果,赋值给新的变量名A

命令变量实践

查看默认的空值变量
[root@rocky10 ~]# echo $myuser
方法1设定变量名
[root@rocky10 ~]# myuser=`whoami`
[root@rocky10 ~]# echo $myuser
root
查看默认的空值变量
[root@rocky10 ~]# echo $mydir
方法2设定变量名
[root@rocky10 ~]# mydir=$(pwd)
[root@rocky10 ~]# echo $mydir
/root
清理变量
[root@rocky10 ~]# unset mydir myuser

全局变量

基本定义

全局变量是什么
 全局变量就是:在当前系统的所有环境下都能生效的变量。
查看全局环境变量
 env 只显示全局变量,一般结合 grep 和管道符来使用
 printenv 效果与env等同
 
 export 查看所有的环境变量,包括声明的过程等信息,一般不用
 declare -x 效果与export类似
定义全局变量方法一:
 变量=值
 export 变量
定义全局变量方法二:(最常用)
 export 变量=值

查看全局变量

查看所有的全局变量
[root@rocky10 ~]# env
XDG_SESSION_ID=4
HOSTNAME=localhost
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
...
查看制定的全局变量
[root@rocky10 ~]# env | grep SHELL
SHELL=/bin/bash
定制本地变量
[root@rocky10 ~]# envtype=local
[root@rocky10 ~]# echo $envtype
local
从全局变量中查看
[root@rocky10 ~]# env | grep envtype
[root@rocky10 ~]#
结果显示:
 无法从全局变量中查看本地变量的名称

定制全局变量

方法1定制全局变量
[root@rocky10 ~]# echo $envtype
local
[root@rocky10 ~]# env | grep envtype
[root@rocky10 ~]# export envtype
[root@rocky10 ~]# env | grep envtype
envtype=local
方法2定制全局变量
[root@rocky10 ~]# export myuser=root
[root@rocky10 ~]# env | grep myuser
myuser=root
清理全局变量
[root@rocky10 ~]# unset envtype myuser mydir

变量体系

变量文件

在linux环境中,有很多目录下的文件都可以定制一些作用范围更广的变量,这些文件或文件所在的目录有:
 作用范围在制定的用户范围:
        ~/.bashrc
        ~/.bash_profile
    作用的范围在系统范围:
        /etc/profile
        /etc/profile.d/env_file_name

bashrc和bash_profile

实践

查看未知的变量名
[root@rocky10 ~]# echo $NAME
定制变量名到文件中
[root@rocky10 ~]# echo NAME=shuji >> ~/.bashrc
[root@rocky10 ~]# source ~/.bashrc
[root@rocky10 ~]# echo $NAME
shuji
新开一个终端查看效果
[root@rocky10 ~]# echo $NAME
shuji
新开一个普通用户的终端查看效果
[root@rocky10 ~]# su - python
[python@rocky10 ~]$ echo $NAME
清理.bashrc 文件里的变量,然后清除当前环境下的变量名
unset NAME

profile实践

查看未知的变量名
[root@rocky10 ~]# echo $PROFILE
定制变量名到文件中
[root@rocky10 ~]# echo PROFILE=shuji >> /etc/profile
[root@rocky10 ~]# source /etc/profile
[root@rocky10 ~]# echo $PROFILE
shuji
新开一个终端查看效果
[root@rocky10 ~]# echo $PROFILE
shuji
新开一个普通用户的终端查看效果
[root@rocky10 ~]# su - python
[python@rocky10 ~]$ echo $PROFILE
shuji

内置变量

image-20260124090814972

实践1 - $0 获取脚本的名称

[root@rocky10 ~]# cat get_name.sh
#!/bin/bash
# 获取脚本的名称
echo "我脚本的名称是: file.sh"
echo "我脚本的名称是:$0 " 

实践2 - $n 获取当前脚本传入的第n个位置的参数

[root@rocky10 ~]# cat get_args.sh
#!/bin/bash
# 获取指定位置的参数
echo "第一个位置的参数是: $1"
echo "第二个位置的参数是: $2"
echo "第三个位置的参数是: $3"
echo "第四个位置的参数是: $4"

实践3 - $# 获取当前脚本传入参数的数量

[root@rocky10 ~]# cat get_number.sh
#!/bin/bash
# 获取当前脚本传入的参数数量
echo "当前脚本传入的参数数量是: $#"

字符串相关

字符串变量解释

字符串计数
 ${#file} 获取字符串的长度
字符串截取 
 - 语法为${var:pos:length}   表示对变量var从pos开始截取length个字符,pos为空标示0
    ${file:0:5} 从0开始【第1个字符】,截取5个字符
    ${file:5:5} 从5开始【第6个字符】,截取5个字符
    ${file::5} 从0开始【第1个字符】,截取5个字符
    ${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
    ${file: -4} 返回字符串最后四个字符,-前面是"空格

获取信息实践

字符串实践

定制字符串内容
[root@rocky10 ~]# string_context="dsjfdsafjkldjsklfajkdsa"
[root@rocky10 ~]# echo $string_context
dsjfdsafjkldjsklfajkdsa

获取字符串长度
[root@rocky10 ~]# echo ${#string_context}
23

字符截取实践

从0开始,截取5个字符
[root@rocky10 ~]# echo ${string_context:0:5}
dsjfd
从5开始,截取5个字符
[root@rocky10 ~]# echo ${string_context:5:5}
safjk 
从0开始,截取5个字符
[root@rocky10 ~]# echo ${string_context::5}
dsjfd
从倒数第6个字符开始,截取之后的3个字符
[root@rocky10 ~]# echo ${string_context:0-6:3}
ajk
返回字符串最后四个字节,-前面是"空格"
[root@rocky10 ~]# echo ${string_context: -4}
kdsa

表达式

运算符

运算符 - 数据值之间的操作
 赋值运算
 - 结果值输出
 - 示例: =、*=、/=、%=、+=、-=、<<=、>>=、&=、^=、|=等
 二元运算
 - 数据值操作
 - 示例: +、-、*、/、%等
 高阶运算
 - 更高一级的数学运算
 - 示例:**、^、++、--、
 其他运算
 - 其他运算操作
 - 示例:<<、>>等
注意:
 这些所谓的运算符一般很难单独来使用,都需要结合计算表达式来实现相应的效果

简单的赋值操作

为变量赋值
[root@rocky10 ~]# echo $num $string
[root@rocky10 ~]# num=123 string=abc
[root@rocky10 ~]# echo $num $string
123 abc
赋值时候定制属性
[root@rocky10 ~]# declare stringnum=123
[root@rocky10 ~]# declare string=nihao
[root@rocky10 ~]# echo $stringnum $string
123 nihao
[root@rocky10 ~]# declare -i num=654
[root@rocky10 ~]# declare -i num2=aaa
[root@rocky10 ~]# echo $num $num2
654 0

简单计算

格式

方法1:
 $[计算表达式]
方法2:
 a=$[变量名a+1]
注意:
 这里的表达式可以不是一个整体

简单示例

简单运算
[root@rocky10 ~]# echo $[100/5]
20
[root@rocky10 ~]# echo $[ 2 + 5 ]
7
变量参与运算
[root@rocky10 ~]# a=6
[root@rocky10 ~]# a=$[a+1]
[root@rocky10 ~]# echo $a
7
运算结果取整
[root@rocky10 ~]# echo $[100/3]
33

字符串表达式

所谓的字符串表达式,主要是判断 比较运算符 两侧的值的内容是否一致,由于bash属于弱类型语言,所以,默认情况下,无论数字和字符,都会可以被当成字符串进行判断。
内容比较判断
    str1 == str2 str1和str2字符串内容一致
    str1 != str2 str1和str2字符串内容不一致,!表示相反的意思
内容空值判断
    -z str 空值判断,获取字符串长度,长度为0,返回True
    -n  "str" 非空值判断,获取字符串长度,长度不为0,返回True
   注意:str外侧必须携带"",否则无法判断

实践

判断字符串内容是否一致
[root@rocky10 ~]# test aaa == bbb
[root@rocky10 ~]# echo $?
1
[root@rocky10 ~]# test aaa != bbb
[root@rocky10 ~]# echo $?
0
判断数字内容是否一致
[root@rocky10 ~]# num1=234 num2=456
[root@rocky10 ~]# test $num1 == $num2
[root@rocky10 ~]# echo $?
1
[root@rocky10 ~]# test $num1 != $num2
[root@rocky10 ~]# echo $?
0

循环逻辑

for基础

循环逻辑语法解析:
 关键字 [ 条件 ]
 do
 执行语句
 done
 
注意:
 这里的关键字主要有四种:
 for - 循环遍历一个元素列表
 while - 满足条件情况下一直循环下去
 until - 不满足条件情况下一直循环下去

语法解析

场景:遍历列表
    for 值 in 列表
    do
       执行语句
    done

列表生成

样式1:手工列表
 - 1 2 3 4 5 6 7
样式2:定制列表
 - {1..7}
样式3:命令生成
 - $(seq 1 7)
样式4:脚本参数
 - $@ $*

手工列表实践

查看脚本内容
[root@rocky10 ~]# cat for_hand_list.sh
#!/bin/bash
# 功能:手工列表 for循环
for i in yuwen shuxue lishi
do
  echo "列表元素: ${i}"
done
脚本执行后效果
[root@rocky10 ~]# /bin/bash for_hand_list.sh
列表元素: yuwen
列表元素: shuxue
列表元素: lishi

定制列表实践

查看脚本内容
[root@rocky10 ~]# cat for_define_list.sh
#!/bin/bash
# 功能:定制列表 for循环
for i in {1..3}
do
  echo "列表元素: ${i}"
done
脚本执行后效果
[root@rocky10 ~]# /bin/bash for_define_list.sh
列表元素: 1
列表元素: 2
列表元素: 3

命令生成实践

查查看脚本内容
[root@rocky10 ~]# cat for_cmd_list.sh
#!/bin/bash
# 功能:命令生成列表 for循环
for i in $(seq 1 3)
do
  echo "列表元素: ${i}"
done
脚本执行后效果
[root@rocky10 ~]# /bin/bash for_cmd_list.sh
列表元素: 1
列表元素: 2
列表元素: 3

脚本参数实践

查看脚本内容
[root@rocky10 ~]# cat for_arg_list.sh
#!/bin/bash
# 功能:脚本参数列表 for循环
for i in $@
do
  echo "列表元素: ${i}"
done
脚本执行后效果
[root@rocky10 ~]# /bin/bash for_arg_list.sh 1 2 3
列表元素: 1
列表元素: 2
列表元素: 3

while基础

简介

while命令有点像 if/then 和 for循环之间的结合,while走循环之前会对输入的值进行条件判断,
如果满足条件的话,才会进入到循环体中执行对应的语句,否则的话就退出循环。
场景:只要条件满足,就一直循环下去
    while [ 条件判断 ]
    do
       执行语句
    done

实践1-输出制定的范围数字

[root@rocky10 ~]# cat while_num_list.sh
#!/bin/bash
# 功能:while的输出5范围以内的数字
# 定制初始变量值
a=1
# 定制内容输出逻辑
while [ "${a}" -le 5 ]
do
   echo -n "${a} "
   # 每输出一次数据,数据值+1
   a=$((a+1))
   done
echo
脚本执行后效果
[root@rocky10 ~]# /bin/bash while_num_list.sh
1 2 3 4 5
posted @ 2026-01-30 19:55  容器生态守护者  阅读(0)  评论(0)    收藏  举报