Linux SHELL脚本中的变量与运算

[复制链接]
发表于 2025-11-23 23:06:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一.SHELL脚本中的变量

1.1.什么是变量


  •         在编写步调时,通常会遇到被使用对象不固定的情况
  •         我们必要用一串固定的字符来表现不固定的值这就是变量存在的根本意义
  •         变量的实现原理就是内存存储单元的一个符号名称
1.2.变量的定名规则

变量的名称中只能包罗数字、巨细写字母以及下划线 变量的名称只能用巨细写字母及下划线开头 同一名称变量在多次被赋值时为覆盖动作 在企业代码规范化中变量的定名规则如下
  1. 简短全大写变量名      TIMINGLEE
  2. 首字母大写子类变量名   Timing_Lee
  3. 驼峰类型变量名:      kuberneteS_Api
复制代码
1.3.变量的调用方法

$aaa   #表现取$aaa这个变量的值
  1. [root@shell ~]# aaa=1
  2. [root@shell ~]# echo $aaa
  3. 1
  4. [root@shell ~]# echo ${aaa}B
  5. 1B
复制代码

  •         如果我们想表现1b

    •                 $aaab 这个变量调用方式是使用aaab这串字符变量的值
    •                 ${aaa}b 如果必要在一串字符中特别阐明那些字符表现变量那些字符不是,那么需 要用变量声明${}

  •         检察体系中的全部变量可以使用 env
  •         检察体系中所变量或函数可以使用set下令或declare
1.4.字符的转义及引用


  •         在shell中有许多本身有特别功能的字符,好比空格井号等等
  •         如果在给变量赋值或实验下令使用时我们只想使用这些符号本身那么就必要用到转义或引用
  •         在shell中反斜杠表现转义,每个反斜杠只能转义一个字符
  •         在shell中单引号表现强引用,我们可以把它看作批量转义,在单引号内的全部字符被视为字符本身
  •         在shell中双引号表现弱引用,其和单引号的区别在于不能引用(` \ ! $) 代码示比方下
  1. [root@shell mnt]# echo  \#hello
  2. #hello
  3. [root@shell mnt]# echo \# #hello
  4. #
  5. [root@shell mnt]# echo \# \#hello
  6. # #hello
  7. ​
  8. ​
  9. [root@shell mnt]# echo "# #"
  10. # #
  11. [root@shell mnt]# echo "$5"
  12. [root@shell mnt]# echo '$5'
  13. $5
复制代码
1.5.变量的范例

从变量的作用范围来分别,变量分为函数级变量,情况级变量,用户级变量和体系级变量 函数级变量只在函数内见效通常用local来界说
  1. vim aaa.sh
  2. #!/bin/bash
  3. ACTION () {
  4. local a=1
  5. echo $a
  6. }
  7. ACTION
  8. echo $a
  9. #sh test.sh
  10. 1
  11. 第二行显示为空
复制代码
情况级别变量只在当前运行的shell中见效,shell关闭变量被开释
  1. [root@shell mnt]# export B=2
  2. [root@shell mnt]# vim aaa.sh
  3. #!/bin/bash
  4. TEXT()
  5. {
  6. local A=1
  7. echo $A
  8. }
  9. TEXT
  10. echo $B    
  11. [root@shell mnt]# sh aaa.sh
  12. 1
  13. 2
  14. ​
  15. [root@shell mnt]# exit
  16. logout
  17. [root@shell mnt]# sh test.sh
  18. 显示为空
复制代码
用户级变量只有登录体系的指定用户,此变量才见效
  1. [root@shell mnt]# vim ~/.bash_profile
  2. # User specific environment and startup programs
  3. export B=2
  4. [root@shell mnt]# sh -x aaa.sh
  5. + TEXT
  6. + local A=1
  7. + echo 1
  8. 1
  9. + echo 2
  10. 2
  11. [root@shell ~]# su - wan
  12. [wan@shell ~]$ sh /mnt/aaa.sh
  13. 显示为空
复制代码
体系级变量是体系中的永世设定,全部效户都可以使用,体系变量通常被生存到/etc/profile中
  1. [root@shell mnt]# vim /etc/profile.d/b.sh
  2. #!/bin/bash
  3. export B=2
  4. [root@shell mnt]# source /etc/profile.d/b.sh
  5. [root@shell mnt]# vim /mnt/aaa.sh
  6. #!/bin/bash
  7. echo $B
  8. [root@shell mnt]# sh -x aaa.sh
  9. + TEXT
  10. + local A=1
  11. + echo 1
  12. 1
  13. + echo 2
  14. 2
复制代码
在体系中通常设置体系变量是编辑文件更加安全 文件修改完毕后必要用source下令使其见效
1.6.常见的体系及变量

在体系中被预设的变量如下
变量阐明PATH下令的搜刮路径,以冒号作为分隔符HOME用户的家目次的路径,是cd下令的默认参数COLUMNS下令行编辑模式下可使用下令的长度HISTFILE下令汗青的文件路径HISTFILESIZE下令汗青中包罗的最大行数HISTSIZE history下令输出的记载数LOGNAMEUSER 当前用户的名字SHELL当前使用的shellPWD当前的工作目次PS1下令行提示符变量PATH指定下令实验路径黑白常有效 如果我想在当前用户中可以用相对路径方式调用/mnt下的全部可实验文件
  1. [root@shell ~]# chmod +x /mnt/aaa.sh
  2. [root@shell ~]# aaa.sh
  3. bash: aaa.sh: 未找到命令...
  4. [root@shell ~]# vim ~/.bash_profile
  5. PATH=$PATH:/mnt
  6. [root@shell ~]# source ~/.bash_profile
  7. [root@shell ~]# aaa.sh
  8. 1
  9. 2
  10. [root@shell ~]# echo $PATH
  11. /root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
  12. /mnt
复制代码
1.7.特别变量界说方式

1.7.1.用下令的实验结果界说变量

在实验下令时如果想让指定下令优先实验可以使用 $(cmd) 或 ``
  1. [root@shell ~]# date +%m-%d_%H:%M
  2. 12-21_18:34
  3. [root@shell ~]# touch file_$(date +%m-%d_%H:%M)
  4. [root@shell ~]# ls
  5. file_12-21_18:35
  6. [root@shell ~]# touch file_`date +%m-%d_%H:%M` //反向单引号
  7. [root@shell ~]# ls
  8. file_12-21_18:35   file_12-21_18:38
复制代码
1.7.2.传参变量

许多情况下,shell脚本必要担当用户的输入,根据用户的输入来实验差别的使用。 从下令行通报给shell脚本的参数又称为叫做位置参数,shell脚本会根据参数的位置使用差别的位置参数 变量读取他们的值
变量阐明$#下令行的参数的个数$0当前脚本的名称$n当前通报给脚本的第n个参数,好比$1表现脚本的第一个参数,$2表现脚本的第二个参数……$*以“参数1 参数2 参数3”的情势返回全部参数的值$@以“参数1” “参数2” “参数3” 的情势返回全部参数的值
  1. [root@shell ~]# vim test.sh
  2. #!/bin/bash
  3. echo '$1' is $1
  4. echo '$2' is $2
  5. echo '$3' is $3
  6. echo '$#' is $#
  7. echo '$@' is $@
  8. echo '$*' is $*
  9. [root@shell ~]# sh aaa.sh a1 a2
  10. $1 is a1
  11. $2 is a2
  12. $3 is
  13. $# is 2
  14. $* is a1 a2
  15. $@ is a1 a2
  16. [root@shell ~]# sh aaa.sh a1 a2 a3
  17. $1 is a1
  18. $2 is a2
  19. $3 is a3
  20. $# is 3
  21. $* is a1 a2 a3
  22. $@ is a1 a2 a3
复制代码
$? 表现上一条下令的退出值,0表现无任何标题,1-255 表现下令实验报错
$$ 表现当进步程的pid
  1. [root@shell ~]# echo $$
  2. 2617
  3. [root@shell ~]# ps
  4.    PID TTY          TIME CMD
  5.   2617 pts/0    00:00:00 bash
  6.   3469 pts/0    00:00:00 ps
  7. ​
  8. [root@shell ~]# echo $?
  9. 0
  10. [root@shell ~]# ls fff
  11. ls: 无法访问 'fff': 没有那个文件或目录
  12. [root@shell ~]# echo $?
  13. 2
复制代码
1.7.3 交互式传参

使用read下令可以和脚本实验者举行交互传参 示例: 交互赋值单个变量
  1. [root@shell ~]# read A
  2. 123
  3. [root@shell ~]# echo $A
  4. 123
复制代码
交互赋值多个变量
  1. [root@shell ~]# read A B C
  2. 1 2 3
  3. [root@shell ~]# echo $A $B $C
  4. 1 2 3
复制代码
交互赋值数组
  1. [root@shell ~]# read -a ddd
  2. more less some none
  3. [root@shell ~]# echo $ddd
  4. more
  5. [root@shell ~]# echo  ${ddd[1]}
  6. less
  7. [root@shell ~]# echo  ${ddd[2]}
  8. some
  9. [root@shell ~]# echo  ${ddd[3]}
  10. none
复制代码
交互赋值并表现提示符
  1. [root@shell ~]# read -p "Please input word:" A
  2. Please input word:hello
  3. [root@shell ~]# echo $A
  4. hello
复制代码
潜伏赋值内容
  1. [root@shell ~]# read -p "Please input word: " -s A
  2. Please input word: [root@shell ~]# echo $A
  3. hello
复制代码
设置超时时间
  1. [root@shell ~]# read -t 5 -p "Please input word: " A
复制代码
设置赋值长度
  1. [root@shell ~]# read -n 3 -p "Please input word: " A
复制代码
指定录入竣事符
  1. [root@shell ~]# read -d "." a
  2. 123456.
复制代码

  •         -a 读取的内容存入数组
  •         -d 一连读取直到读入 DELIM 变量中的第一个字符,而不是换行符
  •         -n/N 读取N个字符
  •         -p 指定提示信息,用于期待输入
  •         -r 不答应反斜杠转义任何字符
  •         -s 从尺度输入中读取暗码而不在屏幕上表现输入的字符
  •         -t 设置读取输入的超时时间,单元为秒
1.7.4 数组变量

我们可以界说变量为一组内容,中央的元素用空格隔开
  1. A=(1 2 3 4 5)
复制代码
取变量的全部元素
  1. [root@shell ~]# echo ${a[*]}
  2. 1 2 3 4 5
  3. [root@shell ~]# echo ${a[@]}
  4. 1 2 3 4 5
复制代码
取数组的第一个元素
  1. [root@shell ~]# echo ${a[0]}
  2. 1
复制代码
取数组的末了一个元素
  1. [root@shell ~]# echo ${a[-1]}
  2. 5
复制代码
取数组的第1-3个元素
  1. [root@shell ~]# echo ${a[*]:0:3}
  2. 1 2 3
复制代码
检察数组的元素个数
  1. [root@shell ~]# echo ${#a[@]}
  2. 5
复制代码
管理数组元素
  1. [root@shell ~]# a[0]=6 #更改数组第一个元素为6
  2. [root@shell ~]# echo ${a[@]}
  3. 6 2 3 4 5
  4. [root@shell ~]# a[5]=6 #添加数组中的第六个元素为6
  5. [root@shell ~]# echo ${a[@]}
  6. 6 2 3 4 5 6
  7. [root@shell ~]# unset a[0] #删除数组中第一个元素
  8. [root@shell ~]# echo ${a[@]}
  9. 2 3 4 5 6
  10. [root@shell ~]# unset a #删除整个数组
复制代码
1.7.5.变量中字符串的取值管理


示例: 设定实验变量
  1. [root@shell ~]# str="/more/less/some./no.ne"
复制代码
取全部字符串
  1. [root@shell ~]# echo ${str}
  2. /more/less/some./no.ne
复制代码
统计字符串长度
  1. [root@shell ~]# echo ${#str}
  2. 22
复制代码
从指定位置取值到末了
  1. [root@shell ~]# echo ${str:3}
  2. re/less/some./no.ne
复制代码
从指定位置取指定长度的字符
  1. [root@shell ~]# echo ${str:2:4}
  2. ore/
  3. [root@shell ~]# echo ${str::4}
  4. /mor
复制代码
从倒数第3个字符向后取2个字符
  1. [root@shell ~]# echo ${str:0-3:2}
  2. .n
复制代码
取末了5个字符
  1. [root@shell ~]# echo ${str:0-5}
  2. no.ne
复制代码
从开头检索迩来匹配字符串并删除
  1. 从先到后
  2. [root@shell ~]# echo ${str#*/}
  3. more/less/some./no.ne
  4. 从后到前
  5. [root@shell ~]# echo ${str%%/*}
  6. 输出为空
复制代码
从开头检索最远匹配字符串并删除
  1. 从前到后
  2. [root@shell ~]# echo ${str##*/}
  3. no.ne
  4. 从后到前
  5. [root@shell ~]# echo ${str%/*}
  6. /more/less/some.
复制代码
输出为空更换字符
  1. [root@shell ~]# echo ${str/./@} //默认替换第一个
  2. /more/less/some@/no.ne
  3. [root@shell ~]# echo ${str//./@} //替换所有
  4. /more/less/some@/no@ne
复制代码
1.7.5.脚本中的函数

变量是一个厘革值的别名 函数就是一段步调的别名
  1. 1.解决代码重复问题
  2. #!/bin/bash
  3. echo -e "\033[31mread \033[0m"
  4. echo -e "\033[32mgreen \033[0m"
  5. echo -e "\033[33myellow \033[0m"
  6. echo "======     function ============="
  7. ECHO ()
  8. {
  9. echo -e "\033[$1m$2\033[0m"
  10. }
  11. ECHO 31 red
  12. ECHO 32 green
  13. ECHO 33 yellow
复制代码
  1. 2.代码无线循环
  2. #!/bin/bash
  3. ACTION()
  4. {
  5. read -p "Please input word: " WORD
  6. echo $WORD
  7. ACTION
  8. }
  9. ACTION
复制代码
1.8.取消变量

unset 变量 即可把变量取消
如果变量被记载到设置文件中必要在设置文件中删除记载
二.shell中的运算

2.1.shell中的运算下令


2.2.shell中的数学运算符号

shell中常用的运算符号如下:

2.3.位运算

2.3.1.什么是位运算

步调中的全部数在盘算机内存中都是以二进制的情势储存的 位运算就是直接对整数在内存中的二进制位举利用用
2.3.2.二进制的的负数表现方法

2进制表现数字正负时最高位为0表现正数,最高位1表现负数 源码:负数的源码为负数绝对值的二进制数字,整数的源码为本身的二进制 反码:负数绝对值源码取反,但是表现正负的高位值稳定 补码:反码+1为补码,补码即为负数二进制表现方式 盘算结果凌驾8位舍弃凌驾的高位,特别必要情况下使用扩展8位
 1 的二进制源码 0000 0001
-1 的二进制原码 1000 0001
 1 的反码 0000 0001
-1 的反码 1111 1110
 1 的二进制码 0000 0001
-1 的二进制码 1111 1110+0000 0001 = 11111111 
负数补码的缘故原由是为了可以让加法器同时可以运算加法和减法 以时钟位例子 我想把8点调到10点: 顺时针8+2 逆时针8-10 终极时针的位置盘算公式; 8+(顺时针调正的格数|秘密数字-逆时针调解的格子)=终极位置 秘密数字是时钟表现里最大数字+1  
2.3.4位逻辑运算  

  1. [root@shell ~]# vim aaa
  2. 000001 1
  3. 000010 2
  4. 000100 4
  5. 001000 8
  6. [root@shell ~]# echo $((2<<1))
  7. 4
  8. [root@shell ~]# echo $((2>>1))
  9. 1
  10. [root@shell ~]# echo $((4<<1))
  11. 8
  12. [root@shell ~]# echo $((4<<2))
  13. 16
  14. [root@shell ~]# echo $((4<<3))
  15. 32
  16. [root@shell ~]# a=10
  17. [root@shell ~]# echo $((a<<1))
  18. 20
  19. [root@shell ~]# echo $((a<<2))
  20. 40
  21. [root@shell ~]# echo $((a<<3))
  22. 80
  23. [root@shell ~]# a=5
  24. [root@shell ~]# echo $((a<<1))
  25. 10
  26. [root@shell ~]# echo $((a<<2))
  27. 20
  28. [root@shell ~]# echo $((a<<3))
  29. 40
复制代码
  1. [root@shell ~]# echo $((1&2))
  2. 0
  3. [root@shell ~]# echo $((1|2))
  4. 3
  5. [root@shell ~]# echo $((1^2))
  6. 3
  7. [root@shell ~]# echo $((~1))
  8. -2
复制代码
  1. [root@shell ~]# a=1
  2. [root@shell ~]# ((a&=2))
  3. [root@shell ~]# echo $a
  4. 0
  5. [root@shell ~]# a=1
  6. [root@shell ~]# ((a|=2))
  7. [root@shell ~]# echo $a
  8. 3
  9. [root@shell ~]# a=1
  10. [root@shell ~]# ((a^=2))
  11. [root@shell ~]# echo $a
  12. 3
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表