Linux之shell变量

news2024/9/27 15:30:32

华子目录

  • 什么是变量?
  • 变量的名称
    • 示例
  • 变量的类型
  • 变量的定义
    • 示例
  • 自定义变量
    • 查看变量(自定义变量和全局变量)
  • 环境变量
    • 定义环境变量(全局变量)
      • 法一
      • 法二
      • 法三
      • env,printenv,export
      • 注意
    • C语言与shell的对比
    • shell环境变量存储的文件
      • 结论
  • 位置变量
    • 常见的位置变量
    • 示例
    • $* 与 $@的区别
  • 变量赋值和作用域
    • 赋值
  • read从键盘读入变量值
    • 常用格式
  • 变量和引号
  • 变量的作用域
    • 全局示例
    • 局部示例(使用local声明)
    • 全局变量和局部变量区别
  • 变量的运算
    • 示例1(整数运算)
    • 示例2(字符串截取)

什么是变量?

  • 变量是在程序中保存用户数据的一段内存存储空间变量名内存空间的首地址

变量的名称

  • 组成字母,数字,下划线不能以数字开头
  • 变量名称的长度,shell没有明确规定,但是为了增加可读性,建议使用较短的,见名知意的名称命名
  • 规则
    • 首字符必须为字母
    • 中间不能有空格,可以使用下划线
    • 不能使用标点符号
    • 不能使用bash中关键字,输入help查看bash的保留字

示例

#正常定义变量
[root@server ~]# Java_home=/usr/bin/jvm/jre-1.6.0-openjdk.x86_64

[root@server ~]# sum=0

[root@server ~]# back_up=/root
#使用$符号进行变量名的取值
[root@server ~]# echo $Java_home
/usr/bin/jvm/jre-1.6.0-openjdk.x86_64

[root@server ~]# echo $sum
0

[root@server ~]# echo $back_up
/root

变量的类型

  • 原则:shell是一种动态类型语言和弱类型语言,变量是不分数据类型的,统一都使用字符串存储,但根据变量的上下文环境,允许程序执行一些不同的操作,如:比较、整数加减
  • shell的变量数据类型
[root@server ~]# vim  test1.sh
#!/bin/bash
x=123
let x+=1
echo  "x=$x"


[root@server ~]# bash test1.sh
x=124

在这里插入图片描述

变量的定义

  • 原则:直接使用,不需要变量声明
  • 格式:变量名=值

示例

[root@server ~]# vim test2.sh
#!/bin/bash
a=1
b="hello"
c="hello world"   #(中间的如果有空格,必须加双引号)
back_dir=/mnt  
  • 前后不能加空格
[root@server ~]# a= 3
bash: 3: command not found...
[root@server ~]# b = 5
bash: b: command not found...
[root@server ~]# c =6
bash: c: command not found...
  • 字符串类型建议使用双引号作为定界符引起,尤其是字符串中有空格
[root@server ~]# stu_name=zhang san
bash: san: command not found...

[root@server ~]# stu_name="zhang san"
[root@server ~]# stu_name='zhang san'

自定义变量

  • 概念:上述以赋值形态形成的变量定义形式称为自定义变量
  • 引用变量的值:
    • $变量名
    • ${表达式或变量名}
[root@server ~]# a=1024
[root@server ~]# echo $a
1024
[root@server ~]# echo ${a}
1024

查看变量(自定义变量和全局变量)

[root@server ~]# set | more   #分页显示

[root@server ~]# declare | more  #也是分页显示

环境变量

  • 环境变量又称为全局变量,可以在任意子shell生效环境变量又分为自定义环境变量bash内置的环境变量,用户退出命令后改变量会丢失,若需要永久保存就必须写在配置文件中

定义环境变量(全局变量)

法一

[root@server ~]# export  环境变量=值

[root@server ~]# export back_dir1=/home/fox

法二

[root@server ~]# 变量名=值
[root@server ~]# export  变量名


[root@server ~]# name=huazi
[root@server ~]# export name

法三

[root@server ~]# declare  -x   变量名=值

[root@server ~]# declare -x age=20

env,printenv,export

这三个命令都是用来查看当前用户的环境变量

[root@server /]# env         # 查看当前root用户的环境变量

[root@server /]# printenv    # 同上

[root@server /]# export      # 同上

注意

以上定义的环境变量都是临时的重启后会失效若要永久生效,则需要写入到配置文件中

C语言与shell的对比

C语言      局部变量      全局变量
shell     自定义变量     环境变量

shell环境变量存储的文件

  • bash shell 初始化文件有:/etc/profile、 ~/.bash_profile、 ~/.bash_login、 ~/.profile、 ~/.bashrc、/etc/bashrc
  • 在这里插入图片描述
  • /etc/profile :存放一些全局(共有)变量不管哪个用户登录时都会读取该文件。通常设置一些Shell变量PATH,USER,HOSTNAME和HISTSIZE等
  • ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次,默认情况下,此文件通过脚本执行同目录下用户的.bashrc文件
  • ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取
  • /etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取
  • /etc/inputrc文件为特定的情况处理键盘映射
  • 执行顺序:/etc/profile–>/etc/profile.d/*.sh–> ~/.bash_profile -->/etc/bashrc–>~./.bashrc

结论

  • 对于用户的环境变量设置,常见的是用户家目录下的.bashrc和.bash_profile
  • 对于全局环境变量设置常见的文件有:/etc/profile /etc/bashrc /etc/profile.d 这三个配置文件,常用方法是直接在/etc/profile文件中写入全局变量,如果想要在登陆后初始化或者显示加载的内容,只需要把脚本文件放在 /etc/profile.d 文件下即可

位置变量

  • 概念:当一条命令或脚本执行时,后面可以跟多个参数,可以使用位置变量来表示该参数
[root@server /]# bash  test1.sh  hello  world  123  456
#当执行test1.sh 脚本时,第一个参数为hello到第四个参数可以使用特殊的符号表示,如:$1     \$2     \$3   ……

常见的位置变量

$0 : 脚本名
$1-$9 : 1-9个参数
${10} :10以上的参数需要大花括号括起
$* : 所有参数
$@ : 所有参数
$# : 参数个数
$$ : 当前进程的PID
$! : 上一个后台进程的PID
$? : 上一个命令的返回值状态码,0为成功

示例

[root@server ~]# vim test3.sh
#!/bin/bash

echo "第2个位置参数是:$2"
echo "第1个位置参数是:$1"
echo "第4个位置参数是:$4"
echo "所有参数是:$*"
echo "所有参数是:$@"
echo "参数个数是:$#"
echo "当前脚本的进程pid值:$$"
echo "当前脚本的文件名:$0"        

在这里插入图片描述

[root@server ~]# bash test3.sh 1 2 3 4 5
第2个位置参数是:2
第1个位置参数是:1
第4个位置参数是:4
所有参数是:1 2 3 4 5     # 本质为 "1 2 3 4 5"
所有参数是:1 2 3 4 5     # 本质为 "1" "2" "3" "4" "5"
参数个数是:5
当前脚本的进程pid值:2172
当前脚本的文件名:test3.sh
[root@server ~]# bash test3.sh a b c d e f g
第2个位置参数是:b
第1个位置参数是:a
第4个位置参数是:d
所有参数是:a b c d e f g
所有参数是:a b c d e f g
参数个数是:7
当前脚本的进程pid值:2175
当前脚本的文件名:test3.sh

$* 与 $@的区别

$* 和 $ @没有被引用的时候,它们确实没有什么区别,
都会把位置参数当成一个个体, "$*"会把所有位置参数当成
一个整体(或者说当成一个单词),如果没有位置参数,
则"$* "为空,如果有两个位置参数并且IFS为
空格时,"$*"相当于"$1 $2"
"$@"会把所有位置参数当成一个单独的字段,如果没有
位置参数($#为0),则"$@"展开
为空(不是空字符串,而是空列表),如果存在一个
位置参数,则"$@"相当于"$1",如果有
两个参数,则"$@"相当于"$1" "$2"等等

变量赋值和作用域

赋值

变量名=
[root@server ~]# ip1=192.168.80.129

[root@server ~]# school="xiangongyedaxue"

[root@server ~]# today1=`date +%F`

[root@server ~]# today2=$(date +%F)


[root@server ~]# echo $ip1
192.168.80.129
[root@server ~]# echo $school
xiangongyedaxue
[root@server ~]# echo $today1
2024-03-14
[root@server ~]# echo $today2
2024-03-14

read从键盘读入变量值

  • read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
  • 格式read -参数 变量名
  • 参数
    • -p “提示语句:” 屏幕打印出一行提示语句。
    • -n数字:当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量,如:-n1 , 只要接受到一个字符就退出。只要按下一个字符进行回答,read命令立即接受输入并将其传给变量。无需按回车键
    • -t 等待时间 :计时输入,使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个计时器。-t选项指定read命令等待输入的秒数。当计时满时,read命令返回一个非零退出状态
    • -s : 关闭回显使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色)

常用格式

[root@server ~]# read hua
zi     #通过键盘手动输入
[root@server ~]# echo $hua
zi
[root@server ~]# read -p "请输入姓名:" name1
请输入姓名:华子
[root@server ~]# echo $name1
华子
[root@server ~]# read -t 3 -p "请输入姓名:" name2
请输入姓名:[root@server ~]#    等待3秒未输入则结束输入
[root@server ~]# 
[root@server ~]# read -s -p "请输入姓名:" name4
请输入姓名:[root@server ~]#    -s关闭回显
[root@server ~]# echo $name4
哈哈
[root@server ~]# read
200    #输入200
[root@server ~]# echo $REPLY   #当输入时没有变量接收则会存储到环境变量REPLY
200
[root@server ~]# read t1 t2   # 一次输入多个数据
12 34    #输入12,34
[root@server ~]# echo $t1 $t2
12 34
[root@server ~]# echo $t1,$t2
12,34

变量和引号

  • 双引号:除了==$ 、单引号、反引号、反斜线==之外,其它被引起的内容保持字面意思
  • 单引号所有字符保持字面意思
  • 反引号被引起的字符串转为shell命令
  • 反斜线:转义符(\),屏蔽后面字符的特殊含义
[root@server ~]# a=123
[root@server ~]# echo "$a"
123
[root@server ~]# echo '$a'
$a

变量的作用域

  • 全局变量全局变量定义在脚本中,也可以定义在函数中,作用范围:从定义的开始处到shell脚本结束或者被显示的去除

全局示例

[root@server ~]# vim test5.sh
#!/bin/bash

func()    #定义函数
{
        echo "$v1"
        v1=200                                                                               
}
v1=100
func
echo "$v1"    


[root@server ~]# bash test5.sh
100
200
  • 函数内部定义全局变量
[root@server ~]# vim test6.sh
#!/bin/bash
func()   # 定义函数
{
        v2=200
}
func
echo  "$v2"



[root@server ~]# bash  test5.sh 
200
  • 局部变量:范围更小,仅限于某个程序段中,如:函数、shell等,通过local关键字定义,注意:函数的参数也是局部变量

局部示例(使用local声明)

[root@server ~]# vim  test7.sh
#!/bin/bash
func()   # 定义函数
{
        local v3=200  # 使用local关键字声明为局部变量
}
func
echo  "$v3"



[root@server ~]# bash test7.sh

全局变量和局部变量区别

# 上例修改
[root@server ~]# vim  test8.sh
#!/bin/bash
func()
{
        #输出全局变量v1的值
        echo "global variable v1 is $v1"
        #定义局部变量v1
        local v1=2
        #输出局部变量v1的值
        echo "local variable v1 is $v1"
}
#定义全局变量v1
v1=1
#调用函数
func
#输出全局变量v1的值
echo "global variable v1 is $v1"


[root@server ~]# bash test8.sh
global variable v1 is 1
local variable v1 is 2
global variable v1 is 1

变量的运算

在这里插入图片描述
在这里插入图片描述

示例1(整数运算)

[root@server ~]# expr  1 + 1   # 运算符左右要有空格
2
[root@server ~]# expr  1+1
1+1
[root@server ~]# a=1
[root@server ~]# b=2
[root@server ~]# expr  $a + $b
3
[root@server ~]# expr  a + b
expr: 非整数参数
[root@server ~]# echo  $((1+2))
3
[root@server ~]# echo  $((a+b))
3
[root@server ~]# $((1+2))       # expr等价与echo+(())
bash: 3: command not found...
[root@server ~]# echo  $((1+2))
3
[root@server ~]# echo  $((5/2))
2
[root@server ~]# echo  $((5%3))
2
[root@server ~]# echo  $((3%5))
3
[root@server ~]# echo  $((50%30))
20
[root@server ~]# echo  $((1-5))
-4
[root@server ~]# echo  $((2,5+5))
10 
[root@server ~]# echo  $((2.5+5))  # (())不支持小数
-bash: 2.5+5:语法错误: 无效的算术运算符 (错误符号是 ".5+5")
[root@server ~]# echo  $[2+5]
7
[root@server ~]# echo  $[2.5+5]
-bash: 2.5+5:语法错误: 无效的算术运算符 (错误符号是 ".5+5")

[root@server ~]# bc   # bc计算器
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1+2
3
2-5
-3
5/2
2
1.5+3.6
5.1
5>3
1
3>5
0
quit   # 退出交互模式

示例2(字符串截取)

[root@server ~]# str1="hello world"
[root@server ~]# echo  ${#str1}        # 计算变量的串长度
11
# 变量值截取
[root@server ~]# echo  ${str1:0:3}  # 从左边第一个字符开始截取3个字符
hel
[root@server ~]# echo  ${str1::3}  # 同上,0可以省略
hel
[root@server ~]# echo  ${str1:1}  # 从下标1字符开始截取到尾部
ello world
[root@server ~]# echo  ${str1:0-1:1} # 从右侧第一个字符开始截取1个,左边为0,右边为0-1  0-2  等
d
[root@server ~]# echo  ${str1:0-2:1}
l
[root@server ~]# echo  ${str1:0-5}  # 从右侧数第5个字符截取到尾部
[root@server ~]# echo  ${str1: -5}  # 使用空格替代0
world
[root@server ~]# echo  ${str1:-5}  # 无空格提取整串
hello world
# 使用%截取字符串,含义:删除右边字符,保留左边字符
[root@server ~]# filename=testfile.tar
# %. 表示从右边开始检索第一次出现的点 , 检索到后删除右侧,保留左侧
[root@server ~]# file=${filename%.*}  
[root@server ~]# echo  $file
testfile
# 作用:保留左边内容,用于截取文件的主文件名,去掉扩展名
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url%%:*} # %%表示从右向左检索最后一次出现的冒号,删除右侧保留左侧内容
[root@server ~]# echo  $ul1
http
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url#*.} #  #*.表示左向右检索第一次出现的点,删除左边,保留右边 
[root@server ~]# echo  $ul1
baidu.com/index.html
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url%/*} #  %/* 表示从右向左检索第一次出现的/删除右侧保留左侧
[root@server ~]# echo  $ul1
http://www.baidu.com
[root@server ~]# url=http://www.baidu.com/index.html
[root@server ~]# ul1=${url##*/} #  ##*/ 表示左向右检索最有一次出现的/删除左边保留右边
[root@server ~]# echo  $ul1
index.html

#总结:不管哪种检索方向,检索过的都删掉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1517200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络(001-1)

计算机网络-方老师 总时长 24:45:00 共50个视频,6个模块 此文章包含1.1到1.4的内容 简介 1.1计算机网络的作用 三网融合(三网合一) 模拟信号就是连续信号 数字信号是离散信号 1.2互联网概述 以前2兆带宽就要98 现在几百兆带宽也就几百块 …

Ajax学习笔记(一):原生AJAX、HTTP协议、AJAX案例准备工作、发送AJAX请求、AJAX 请求状态

目录 一、原生AJAX 1.1AJAX 简介 1.2 XML 简介 1.3 AJAX的特点 二、HTTP协议 三、AJAX案例准备工作 四、发送AJAX请求 1.发送GET请求 2.发送POST请求 3.JSON响应 IE缓存问题: 五、AJAX 请求状态 一、原生AJAX 1.1AJAX 简介 AJAX 全称为 Asynchronous …

Java基础-泛型

泛型 基本概念为什么我们需要泛型泛型类型泛型类简单泛型类多元泛型类 泛型接口泛型方法为什么要使用泛型方法呢?使用方法 泛型的上下限上限下限加点难度的例子例子一例子二例子三 深入理解泛型什么是泛型擦除后保留的原始类型泛型类型擦除原则如何进行擦除的?怎么证明存在类…

腾讯云轻量服务器地域选择教程以及不同地域的区别

腾讯云服务器地域怎么选择?不同地域之间有什么区别?腾讯云哪个地域好?地域选择遵循就近原则,访客距离地域越近网络延迟越低,速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素,地域节点选择…

WPF —— TabControl、StackPanel 控件详解

1 TabControl简介 表示包含多个项的控件,这些项共享屏幕上的同一空间。 TabControl有助于最大程度地减少屏幕空间使用量,同时允许应用程序公开大量数据。 TabControl包含共享同一屏幕空间的多个 TabItem 对象。一次只能看到 TabControl 中的一个 Ta…

Oracle登录错误ERROR: ORA-01031: insufficient privileges解决办法

这个问题困扰了我三个星期,我在网上找的解决办法: 1.控制面板->管理工具->计算机管理->系统工具->本地用户和组->ORA_DBA组。 但我电脑上根本找不到。 2.在oracle安装目录下找到oradba.exe运行。 最开始我都不到这个oradba.exe文件在哪…

数字生活的未来:探索Web3的全新世界

随着科技的飞速发展,我们正迈向一个数字化的未来。而在这个数字化的时代,Web3技术的崛起正引领着我们进入一个全新的世界。本文将深入探讨Web3技术的特点以及它给我们带来的全新体验。 1. 去中心化的特点 Web3的去中心化是其最显著的特点之一&#xff0…

设置jmeter默认语言为中文

问题描述 通过面板上面的选项修改语言(如下图),每次运行程序都需要重新再设置一遍,我需要每次打开都是中文界面 解决方案 进入jmeter的文件目录 bin——> jmeter.properties 打开这个文件 搜索Preferred GUI language在下方添…

linux环境基础开发工具1(vim 、 yum)

目录 前言 Linux编辑器-vim使用 Linux 软件包管理器 yum 前言 集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码…

如何利用百度SEO优化技巧将排到首页

拥有一个成功的网站对于企业和个人来说是至关重要的,在当今数字化的时代。在互联网上获得高流量和优质的访问者可能并不是一件容易的事情,然而。一个成功的SEO战略可以帮助你实现这一目标。需要一些特定的技巧和策略、但要在百度搜索引擎中获得较高排名。…

爬虫3_爬取翻页URL不变的网站

之前实现了对大学排数据爬取:爬虫2_2019年549所中国大学排名. 近期复现代码,发现原网站升级,在翻页时,发现URL不改变,修改代码,使用网页自动化工具selenium实现对该类网站数据获取。 #-*- coding: UTF-8 -…

hadoop伪分布式环境搭建详解

(操作系统是centos7) 1.更改主机名,设置与ip 的映射关系 hostname //查看主机名 vim /etc/hostname //将里面的主机名更改为master vim /etc/hosts //将127.0.0.1后面的主机名更改为master,在后面加入一行IP地址与主机名之间的…

数字排列 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 小明负责公司年会,想出一个趣味游戏: 屏幕给出 1−9 中任意 4 个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 n 位置…

稀碎从零算法笔记Day17-LeetCode:有效的括号

题型:栈 链接:20. 有效的括号 - 力扣(LeetCode) 来源:LeetCode 题目描述(红字为笔者添加) 给定一个只包括 (,),{,},[,] 的字符串 …

CentOS无法解析部分网站(域名)

我正在安装helm软件,参考官方文档,要求下载 get-helm-3 这个文件。 但是我执行该条命令后,报错 连接被拒绝: curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 # curl: (7) Fai…

Spring Boot 集成 WebSocket 实例 | 前端持续打印远程日志文件更新内容(模拟 tail 命令)

这个是我在 CSDN 的第一百篇原则博文,留念😎 #1 需求说明 先说下项目结构,后端基于 Spring Boot 3,前端为 node.js 开发的控制台程序。现在希望能够在前端模拟 tail 命令,持续输出后端的日志文件。 #2 技术方案 #2.…

手动创建线程池各个参数的意义?

今天我们学习线程池各个参数的含义,并重点掌握线程池中线程是在什么时机被创建和销毁的。 线程池的参数 首先,我们来看下线程池中各个参数的含义,如表所示线程池主要有 6 个参数,其中第 3 个参数由 keepAliveTime 时间单位组成。…

人工智能课题、模型源码

人工智能研究生毕业~深度学习、计算机视觉、时间序列预测(LSTM、GRU、informer系列)、python、人工智能项目代做和指导,各种opencv图像处理、图像分类模型(vgg、resnet、mobilenet、efficientnet等)、人脸检…

.NET高级面试指南专题十七【 策略模式模式介绍,允许在运行时选择算法的行为】

介绍: 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。它定义了一系列算法,将每个算法封装到一个对象中,并使它们可以互相替换。这使得算法可独立于使用它的客户端变化。 原理: 策略接口(Strat…

使用BBDown下载bilibili视频的方法

一款命令行式哔哩哔哩下载器. Bilibili Downloader. 下载地址 https://github.com/nilaoda/BBDown 功能 番剧下载(Web|TV|App) 课程下载(Web) 普通内容下载(Web|TV|App) 合集/列表/收藏夹/个人空间解析 多分P自动下载 选择指定分P进行下载 选择指定清晰度进行下载 下载外挂字幕…