编辑
2023-03-21
Linux学习
00
请注意,本文编写于 548 天前,最后修改于 548 天前,其中某些信息可能已经过时。

目录

Shell变量
变量的类型
1.自定义变量
2.环境变量
3.位置变量
4.预定义变量
变量的赋值方式
1.显式赋值
2.read 从键盘读入变量值
定义引用变量
变量的运算
1.整数运算
2.小数运算
变量截取
1.匹配截取
2.索引及切片
3."内容"的替换
4.变量的替代
5.${变量名-新的变量值}
6.${变量名:-新的变量值}

Shell变量

用一个固定的字符串去表示不固定的内容

变量的类型

1.自定义变量

定义变量:变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115 引用变量:变量名或变量名 或 {变量名} 查看变量:echo $变量名 set(所有变量:包括自定义变量和环境变量)取消变量:unset 变量名作用范围:仅在当前Shell中有效

示例:

#!/bin/bash xihongshi=7 mogu=6 huluobo=8 echo 今日菜价: echo echo 西红柿:${xihongshi}¥ 一斤 echo 蘑菇:${mogu}¥ 一斤 echo 胡萝卜:${huluobo}¥ 一斤 echo echo 欢迎买菜!!! 下次便宜点!!

2.环境变量

定义环境变量:

方法一 export back_dir2=/home/backup

方法二 export back_dir1 将自定义变量转换成环境变量

引用环境变量:变量名或变量名 或 {变量名}

查看环境变量:echo $变量名 env 例如 env | grep back_dir2set

取消环境变量:unset 变量名 变量作用范围:在当前Shell和子Shell有效

3.位置变量

主要是在脚本执行后加参数!!!

11 2 33 4 55 6 77 8 99 {10}

示例:

#!/bin/bash echo 我是谁:$0 echo 我的第一个位置是: $1 echo 我的第二个位置是: $2 echo 我的年龄是:$1 echo 我的名字是:$2 echo 我的学校是:$3 echo 位置变量我学会了!!

4.预定义变量

0脚本名(自己本身)0 脚本名(自己本身) 所有的参数 ""会将所有的参数作为一个整体,以"" 会将所有的参数作为一个整体,以"1 22 … n"的形式输出所有参数@所有的参数"@ 所有的参数 "@" 会将各个参数分开,以"1""1" "2" … "n"的形式输出所有参数n" 的形式输出所有参数# 参数的个数$$当前进程的PID!上一个进程的pid! 上一个进程的pid? 上一个命令的返回值 0表示成功

示例:

#!/bin/bash echo "我的脚本是存在的: $0" echo "我的所有参数为: $*" echo "我的所有参数为: $@" echo "我的参数个数为:$#" echo "我的系统当前pid为:$$" sleep 1000 & echo "我的系统上一个pid为:$!" echo pwd echo "我上一个命令: $?"

示例:

# vim test.shecho "第2个位置参数是$2"echo "第1个位置参数是$1"echo "第4个位置参数是$4"echo "所有参数是: $*"echo "所有参数是: $@"echo "参数的个数是: $#" echo "当前进程的PID是: $$" echo '$1='$1 echo '$2='$2 echo '$3='$3 echo '$*='$* echo '$@='$@ echo '$#='$# echo '$$='$$

变量的赋值方式

1.显式赋值

变量名=变量值

示例:

ip1=192.168.1.251 school="BeiJing 1000phone" ' ' today1=`date +%F` 截取命令中本身含义 today2=$(date +%F) 截取命令中本身含义

2.read 从键盘读入变量值

  • read 变量名
  • read -p "提示信息: " 变量名
  • read -t 5 -p "提示信息: " 变量名
  • read -n 2 变量名
  • read: 用法
    -ers -d 分隔符 -n 读取字符数 -p 提示符 -u 文件描述符
  • -s 不显示输出内容
  • stty -echo (stty echo) 命令行隐藏输入

示例:

#!/bin/bash read -p "请输入你的姓名:" nameread -p "请输入你的密码:" passecho echo 你的姓名是:$name echo 你的密码是: $pass #!/bin/bash read -p "请输入你的姓名:" name read -s -p "请输入你的密码:" passecho echo 你的姓名是:$name echo 你的密码是: $pass [root@qfdeu ~]# vim first.sh back_dir1=/var/backup read -p "请输入你的备份目录: " back_dir2 echo $back_dir1 echo $back_dir2 [root@qfdeu ~]# sh first.sh

示例:

[root@qfdeu ~]# vim ping2.sh #!/bin/bash read -p "Input IP: " ip ping -c2 $ip &>/dev/null if [ $? = 0 ];then echo "host $ip is ok" else echo "host $ip is fail" fi [root@qfdeu ~]# chmod a+x ping2.sh [root@qfdeu ~]# ./ping.sh

定义引用变量

" " 弱引用

' ' 强引用

[root@qfdeu ~]# school=1000phone [root@qfdeu ~]# echo "${school} is good" 1000phone is good [root@qfdeu ~]# echo '${school} is good' ${school} is good

(反引号)命令替换 等价于 $() 反引号中的Shell命令会被先执行

[root@qfdeu ~]# touch `date +%F`_file1.txt [root@qfdeu ~]# touch $(date +%F)_file2.txt [root@qfdeu ~]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'" # 错误 [root@qfdeu ~]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}') [root@qfdeu ~]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}'`

变量的运算

1.整数运算

方法一:expr

[root@qfdeu ~]# expr 1 + 2 [root@qfdeu ~]# expr $num1 + $num2 + - \* / %

方法二:$(())

[root@qfdeu ~]# echo $(($num1+$num2)) + - * / % [root@qfdeu ~]# echo $((num1+num2)) [root@qfdeu ~]# echo $((5-3*2)) [root@qfdeu ~]# echo $(((5-3)*2)) [root@qfdeu ~]# echo $((2**3)) [root@qfdeu ~]# sum=$((1+2)); echo $sum

方法三:$[]

[root@qfdeu ~]# echo $[5+2] + - * / % [root@qfdeu ~]# echo $[5**2]

方法四:let

[root@qfdeu ~]# let sum=2+3; echo $sum [root@qfdeu ~]# let i++; echo $i let a+=2 //和a=a+2的效果一样 += 加等 *= 乘等 -= 减等 /= 除等 %= 模等

2.小数运算

[root@qfdeu ~]# echo "2*4" |bc [root@qfdeu ~]# echo "2^4" |bc [root@qfdeu ~]# echo "scale=2;6/4" |bc [root@qfdeu ~]# awk 'BEGIN{print 1/2}' [root@qfdeu ~]# echo "print 5.0/2" |python

随机数:$RANDOM

变量截取

1.匹配截取

[root@qfedu ~]# url=www.sina.com.cn [root@qfedu ~]# echo ${#url} # 获取变量值的长度15 [root@qfedu ~]# echo ${url} # 标准查看 www.sina.com.cn [root@qfedu ~]# echo ${url#*.} # 从前往后,最短匹配 sina.com.cn [root@qfedu ~]# echo ${url##*.} # 从前往后,最长匹配 贪婪匹配 cn [root@qfedu ~]# url=www.sina.com.cn [root@qfedu ~]# echo ${url} www.sina.com.cn [root@qfedu ~]# echo ${url%.*} # 从后往前,最短匹配 www.sina.com [root@qfedu ~]# echo ${url%%.*} # 从后往前,最长匹配 贪婪匹配 www [root@qfedu ~]# url=www.sina.com.cn [root@qfedu ~]# echo ${url#a.} www.sina.com.cn [root@qfedu ~]# echo ${url#*sina.} com.cn [root@qfedu ~]# echo $HOSTNAME qfedu.1000phone.com [root@qfedu ~]# echo ${HOSTNAME%%.*} qfedu

2.索引及切片

[root@qfedu ~]# echo ${url:0:5} [root@qfedu ~]# echo ${url:5:5} [root@qfedu ~]# echo ${url:5}

3."内容"的替换

[root@qfedu ~]# url=www.sina.com.cn [root@qfedu ~]# echo ${url/sina/baidu} www.baidu.com.cn [root@qfedu ~]# url=www.sina.com.cn [root@qfedu ~]# echo ${url/n/N} www.siNa.com.cn [root@qfedu ~]# echo ${url//n/N} 贪婪匹配 www.siNa.com.cN

4.变量的替代

[root@qfedu ~]# unset var1 [root@qfedu ~]# [root@qfedu ~]# echo ${var1} [root@qfedu ~]# echo ${var1-aaaaa} aaaaa [root@qfedu ~]# var2=111 [root@qfedu ~]# echo ${var2-bbbbb} 111 [root@qfedu ~]# [root@qfedu ~]# var3= [root@qfedu ~]# echo ${var3-ccccc}

5.${变量名-新的变量值}

变量没有被赋值:会使用“新的变量值“ 替代

变量有被赋值(包括空值):不会被替代

[root@qfedu ~]# unset var1 [root@qfedu ~]# unset var2 [root@qfedu ~]# unset var3 [root@qfedu ~]# [root@qfedu ~]# var2= [root@qfedu ~]# var3=111 [root@qfedu ~]# echo ${var1:-aaaa} aaaa [root@qfedu ~]# echo ${var2:-aaaa} aaaa [root@qfedu ~]# echo ${var3:-aaaa} 111

6.${变量名:-新的变量值}

变量没有被赋值(包括空值):都会使用“新的变量值“ 替代

变量有被赋值:不会被替代

[root@qfedu ~]# echo ${var3+aaaa} [root@qfedu ~]# echo ${var3:+aaaa} [root@qfedu ~]# echo ${var3=aaaa} [root@qfedu ~]# echo ${var3:=aaaa} [root@qfedu ~]# echo ${var3?aaaa} [root@qfedu ~]# echo ${var3:?aaaa}
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Gustav

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!