Shell变量篇 shell $变量
connygpt 2024-10-22 10:57 3 浏览
Shell变量
Shell变量定义
变量的概述
什么是变量?
?数据的一种传递方式。用一个固定的字符串去表示一个不固定的字符串,数值,内容,数据等,?方便后续调用
?
变量名的规范
?1. 建议采用驼峰式方式,如:Hostname_Ip
?2. 变量名由字母,数字,下划线组成,不能使用空格,短横岗-,特殊符号尽量不用
?3. 变量名要便于理解,赋值时等号两边不能有空格
Shell变量定义的方式
1. 用户自定义变量
2. 系统环境变量:系统定义好的,系统操作环境相关信息
3. 位置参数变量:变量名是固定的,意思也是固定的,向脚本中进行参数传递
4. 预定义的变量:脚本中已经定义好的,变量名是固定的,作用也是固定的:$- $? $ $@ $*
变量的实践
1、用户自定义变量
[root@shell01 /scripts]# Name=qiudao #定义变量
[root@shell01 /scripts]# echo $Name #引用变量
qiudao
?
[root@shell01 /scripts]# Name=qiudao shell #变量值中不能出现空格
-bash: shell: command not found
[root@shell01 /scripts]# Name='qiudao shell' #需要引号引起来
[root@shell01 /scripts]# echo $Name
qiudao shell
[root@shell01 /scripts]# Name==qiudao
[root@shell01 /scripts]# echo $Name
qiudao
[root@shell01 /scripts]# echo $Nameshell #调用变量时,变量名不能跟其他字符串连在一起
?
[root@shell01 /scripts]# echo ${Name}shell #将变量名使用大括号进行括起来
qiudaoshell
?
[root@shell01 /scripts]# echo $Name_shell
?
[root@shell01 /scripts]# echo $Name-shell
qiudao-shell
[root@shell01 /scripts]# echo $Name/shell
qiudao/shell
?
?
[root@shell01 /scripts]# echo $Name
qiudao
[root@shell01 /scripts]# echo '$Name'
$Name
[root@shell01 /scripts]# echo "$Name"
qiudao
单引号:强引用,里面是什么,就输出什么,吃什么吐什么
?
双引号:弱引用,吃什么吐什么,会解析变量 $ $()
?
不加引号:在变量定义值时,出现空格,就不会看做是一个整体的值。吃什么吐什么,解析变量
?
反引号 `` 优先执行反引号里面的命令,相当于$()
[root@shell01 /scripts]# echo $Name money is $10000000000000
qiudao money is 0000000000000
[root@shell01 /scripts]# echo '$Name money is $10000000000000'
$Name money is $10000000000000
[root@shell01 /scripts]# echo "$Name money is $10000000000000"
qiudao money is 0000000000000
[root@shell01 /scripts]# echo "$Name money is '$10000000000000'"
qiudao money is '0000000000000'
[root@shell01 /scripts]# echo "$Name money is \$10000000000000"
qiudao money is $10000000000000
[root@shell01 /scripts]# echo '"$Name" money is $10000000000000'
"$Name" money is $10000000000000
?
注意:遇到特殊符号时,使用撬棍进行转义,取消其特殊含义。
2、系统环境变量
[root@shell01 /scripts]# echo $Name
qiudao
[root@shell01 /scripts]# vim test.sh
[root@shell01 /scripts]# cat test.sh
echo $Name
[root@shell01 /scripts]# sh test.sh
?
#用户自定义变量,只在当前环境下生效
?
[root@shell01 /scripts]# export Name=qiudao #自定义系统环境变量,只是临时生效,当前环境及其子Shell环境下生效,永久生效:将定义的变量写入到环境变量配置文件中, /etc/profile /etc/profile.d/*.sh /etc/bashrc ~/.bashrc ~/.bash_profile
#注:export:当前用户的所有环境生效
export写入/etc/bashrc对所有用户永久生效
export写入./bashrc仅对该用户生效
?
[root@shell01 /scripts]# echo $Name
qiudao
[root@shell01 /scripts]# sh test.sh
qiudao
[root@shell01 /scripts]# bash
[root@shell01 scripts]# echo $Name
qiudao
[root@shell01 scripts]# exit
?
[root@shell01 /scripts]# set |grep Name #显示系统中所有定义的变量
Name=qiudao
gitcvs.dbTableNamePrefix
[root@shell01 /scripts]# env #只显示系统环境变量,系统环境变量全部是大写的字母
XDG_SESSION_ID=47
HOSTNAME=shell01
TERM=xterm
?
[root@shell01 /scripts]# echo $Name
qiudao
[root@shell01 /scripts]# unset Name #取消变量
[root@shell01 /scripts]# echo $Name
?
#系统环境变量练习
[root@shell01 /scripts]# cat var.sh
#!/bin/bash
echo "当前系统登录的用户为:$USER"
echo "当前所在的目录位置为:$PWD"
echo "当前系统的主机名为:$HOSTNAME"
echo "当前系统用户的家目录为:$HOME"
echo "当前系统登录的用户的UID为:$UID"
echo "当前系统登录的终端IP为:$SSH_CONNECTION"
[root@shell01 /scripts]# sh var.sh
当前系统登录的用户为:root
当前所在的目录位置为:/scripts
当前系统的主机名为:shell01
当前系统用户的家目录为:/root
当前系统登录的用户的UID为:0
当前系统登录的终端IP为:10.0.0.1 63017 10.0.0.7 22
3、预定义变量及位置变量
[root@shell01 /scripts]# cat path.sh
#!/bin/bash
echo "当前shell的脚本名为:$0"
echo "当前shell的第一个位置变量为:$1"
echo "当前shell的第二个位置变量为:$2"
echo "当前shell的第三个位置变量为:$3"
echo "当前shell的所有位置变量为:$*"
echo "当前shell的所有位置变量为:$@"
echo "当前shell的位置变量的个数为:$#"
echo "当前shell脚本的PID号为:$"
echo "上一条命令的执行结果为:$?"
?
[root@shell01 /scripts]# sh /scripts/path.sh nginx php mysql
当前shell的脚本名为:/scripts/path.sh
当前shell的第一个位置变量为:nginx
当前shell的第二个位置变量为:php
当前shell的第三个位置变量为:mysql
当前shell的所有位置变量为:nginx php mysql
当前shell的所有位置变量为:nginx php mysql
当前shell的位置变量的个数为:3
当前shell脚本的PID号为:8994
上一条命令的执行结果为:0
?
$*与$@的区别(了解即可)
$* 把参数作为一个整体字符串返回
$@ 把参数一个一个进行返回
?
[root@shell01 /scripts]# cat test.sh
#!/bin/bash
test() {
?
echo "未加引号时对比"
echo $*
echo $@
echo "加入引号之后对比"
for i in "$*"
do
echo $i
done
?
echo "###################"
?
for j in "$@"
do
echo $j
done
}
?
test nginx php mysql ansible
[root@shell01 /scripts]# sh test.sh
未加引号时对比
nginx php mysql ansible
nginx php mysql ansible
加入引号之后对比
nginx php mysql ansible
###################
nginx
php
mysql
ansible
?
?
位置变量: $1 $2 .... $9 ${10}
将命令的执行结果赋值给变量
?[root@shell01 /scripts]# Hostname=$(hostname)
[root@shell01 /scripts]# echo $Hostname
shell01
[root@shell01 /scripts]# age=18
[root@shell01 /scripts]# echo $age
18
[root@shell01 /scripts]# echo $(($age+1))
19
[root@shell01 /scripts]# # $(( )) 命令行上面的计算
[root@shell01 /scripts]#
[root@shell01 /scripts]#
[root@shell01 /scripts]# Date=$(date +%F)
[root@shell01 /scripts]# echo $Date
2020-02-19
[root@shell01 /scripts]# mkdir oldboy
[root@shell01 /scripts]# touch oldboy/test{01..10}.txt
[root@shell01 /scripts]# ls oldboy/
test01.txt test02.txt test03.txt test04.txt test05.txt test06.txt test07.txt test08.txt test09.txt test10.txt
[root@shell01 /scripts]# tar czf test.tar.gz $(find oldboy/ -type f -name "*.txt")
[root@shell01 /scripts]# ll
total 16
drwxr-xr-x 2 root root 186 2020-02-19 15:56 oldboy
-rw-r--r-- 1 root root 440 2020-02-19 15:12 path.sh
-rw-r--r-- 1 root root 285 2020-02-19 15:25 test.sh
-rw-r--r-- 1 root root 196 2020-02-19 15:57 test.tar.gz
-rw-r--r-- 1 root root 308 2020-02-19 14:52 var.sh
[root@shell01 /scripts]# Data=$(tar czf test.tar.gz $(find oldboy/ -type f -name "*.txt")) #没有输出结果
[root@shell01 /scripts]# echo $Data
?
[root@shell01 /scripts]# tar cvzf test.tar.gz $(find oldboy/ -type f -name "*.txt")
oldboy/test01.txt
oldboy/test02.txt
oldboy/test03.txt
oldboy/test04.txt
oldboy/test05.txt
oldboy/test06.txt
oldboy/test07.txt
oldboy/test08.txt
oldboy/test09.txt
oldboy/test10.txt
[root@shell01 /scripts]# Data=$(tar cvzf test.tar.gz $(find oldboy/ -type f -name "*.txt")) #加“v”显示输出结果
[root@shell01 /scripts]# echo $Data
oldboy/test01.txt oldboy/test02.txt oldboy/test03.txt oldboy/test04.txt oldboy/test05.txt oldboy/test06.txt oldboy/test07.txt oldboy/test08.txt oldboy/test09.txt oldboy/test10.txt
Shell变量赋值
1、read进行交互赋值
1. read的脚本中示例语法
[root@shell scripts]# cat read01.sh
#!/bin/bash
read -p "please enter a number:" Var
echo "the number you entered is $Var"
2. read简单备份场景
#提示用户输入要备份的目录
#告知用户要备份的目录是什么
#备份目录
#告知用户目录备份完成
[root@shell scripts]# cat read02.sh
#!/bin/bash
read -p "Please enter the directory you want to backup:" Dir
echo "The directory you want to backup is: $Dir"
echo "Backing up ${Dir}......"
echo "$Dir backup completed"
3. 测试用户输入的IP地址是否能通
#提示用户输入IP地址
#根据用户输入的IP地址进行测试
#根据测试的结果,返回给用户,通的就返回通,不通就返回不通
------第一种方法------
[root@shell scripts]# cat read03.sh
#!/bin/bash
#提示用户输入IP地址
read -p "Please input IP address: " Ip
#测试IP地址是否能通
ping -c1 -W1 $Ip &>/dev/null
## -c:代表ping指定次数后停止ping
## -W:以毫秒为单位设置ping的超时时间
#将结果返回给用户
if [ $? -eq 0 ];then
echo "$Ip can connent to the Internet!"
else
echo "NO!!!FAILURE!"
fi
------第二种方法------
[root@shell scripts]# cat read03.sh
#!/bin/bash
#提示用户输入IP地址
read -p "Please input IP address: " Ip
#测试IP地址是否能通,将结果返回给用户
ping -c1 -W1 $Ip &>/dev/null && echo "$Ip can connent to the Internet!" || echo "NO!!!FAILURE!"
4. 添加输出颜色
[root@shell scripts]# cat read04.sh
#!/bin/bash
#提示用户输入IP地址
read -p "Please input IP address: " Ip
#测试IP地址是否能通
ping -c1 -W1 $Ip &>/dev/null
#将结果返回给用户
if [ $? -eq 0 ];then
echo -e "\033[32m$Ip can connent to the Internet!\033[0m"
else
echo -e "\033[31mNO!!!FAILURE!\033[0m"
fi
echo命令的特性:输出颜色
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
?
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"
5. 写一个脚本,修改主机名
#提示用户输入新的主机名
#提示用户是否确认修改主机名
#修改主机名
#根据修改的结果进行判断
#修改成功之后,让其立即生效
[root@shell /scripts]# cat read05.sh
#!/bin/bash
#提示用户输入新的主机名
read -p "Please enter new hostname:" Host
#提示用户是否确认修改主机名
read -p "Confirm whether to change the host name: [y/n]" Judge
#修改主机名
if [ "$Judge" == "y" ];then
hostnamectl set-hostname $Host &>/dev/null
if [ $? -eq 0 ];then
echo "$Host is changed"
bash
else
echo "Please check your script"
fi
else
echo "See you next time!"
fi
6. 写个脚本,修改主机IP地址
#提示用户输入新的IP地址
#提示用户是否真的修改IP地址
#修改eth0和eth1网卡
#修改IP地址,提示用户IP地址修改成功
#提示用户是否重启网络服务,重启后远程连接会断开
[root@shell /scripts]# cat read06.sh
#!/bin/bash
#提示用户输入新的IP地址
read -p "Please enter IP host: " Host
#提示用户是否真的修改IP地址
read -p "Whether to change IP? [y/n]:" Judge
if [ "$Judge" == "y" ];then
sed -ri "/^IPAD/s#(.*\.)(.*)#\1${Host}#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] &>/dev/null
if [ $? -eq 0 ];then
echo "IP has changed."
read -p "Whether to restart network right now?[y/n]:" Res_Net
if [ "$Res_Net" == "y" ];then
systemctl restart network
if [ $? -ne 0 ];then
echo "Fail to restart"
fi
else
echo "You can restart manually later"
fi
else
echo "Please check your config"
fi
else
echo "Bye!"
fi
Shell变量替换
变量 说明
${#变量} 获取变量的长度
${变量#匹配规则} 从头开始匹配,最短删除
${变量##匹配规则} 从头开始匹配,最长删除
${变量%匹配规则} 从尾开始匹配,最短删除
${变量%%匹配规则} 从尾开始匹配,最长删除
${变量/旧的字符串/新的字符串} 替换变量中的旧的字符串为新的字符串,只替换第一个
${变量//旧的字符串/新的字符串} 替换变量中的旧的字符串为新的字符串,替换所有
${变量:匹配规则:匹配规则} 索引及切片
[root@shell /scripts]# url=www.sina.com.cn #定义变量
[root@shell /scripts]# echo $url #打印变量
www.sina.com.cn
[root@shell /scripts]# echo ${#url} #获取变量值的长度
15
[root@shell /scripts]# echo ${url#*.} #从头开始匹配,最短删除,*表示所有,点没有任何含义
sina.com.cn
[root@shell /scripts]# echo ${url##*.} #从头开始匹配,最长删除
cn
?
[root@shell /scripts]# echo ${url%.*} #从尾开始匹配,最短删除
www.sina.com
[root@shell /scripts]# echo ${url%%.*} #从尾开始匹配,最长删除
www
?
[root@shell /scripts]# echo ${url/w/W} #将旧的字符串替换为新的字符串,只替换第一个字符串
Www.sina.com.cn
[root@shell /scripts]# echo ${url//w/W} #将旧的字符串替换为新的字符串,替换所有
WWW.sina.com.cn
[root@shell /scripts]# echo ${url/w/} #将第一个匹配到w删除
ww.sina.com.cn
[root@shell /scripts]# echo ${url//w/} #将所有匹配到w删除
.sina.com.cn
?
[root@shell /scripts]# echo $url #打印变量
w w w . s i n a . com.cn
?
0 1 2 3 4 5 6 7 8 9
?
[root@shell /scripts]# echo ${url:0:3} #从0列开始匹配,切出3列 0-2列
www
?
[root@shell /scripts]# echo ${url:5:4} #从5列开始匹配,切出4列, 5-8列
ina.
[root@shell /scripts]# echo ${url:5} #切除前5列 0-4列删除
ina.com.cn
变量替换案例
1、案例一:查看当前内存的使用率,如果使用率大于80%,则进行报警
#获取内存使用率
#使用率用整数比较
#判断返回结果,大于80则报警,正常就正常提示
[root@shell /scripts]# cat free_use.sh
#!/bin/bash
#当前内存使用率
Mem_Use=$(free -m|awk '/^Mem/{print $3/$2*100}')
#使用率是否超过80%
if [ ${Mem_Use%.*} -gt 80 ];then
echo -e "\033[31mExcessive memory usage! Current:${Mem_Use}%\033[0m"
else
echo -e "\033[32mNormal memory usage...Current:${Mem_Use}%\033[0m"
fi
#测试方法
[root@shell ~]# dd if=/dev/zero of=./1.txt bs=1000M count=1000
2、案例二:每天进行备份/etc/目录,将其备份到/backup目录,需要打包备份,压缩包名为:2020-02-20_Ip_etc.tar.gz
#备份内容:/etc/目录
#备份存储位置:/backup
#备份方式:打包压缩备份,格式2020-02-20_10.0.0.100_etc.tar.gz
#备份的周期:每天
[root@shell /scripts]# cat backup.sh
#!/bin/bash
#定义变量
Dir=/backup
Date=$(date +%F)
Ip=$(ifconfig eth0|awk 'NR==2{print $2}')
#判断目录是否存在,没有就创建
[ -d $Dir ] || mkdir -p $Dir
#开始备份目录
cd / && tar czf ${Dir}/${Date}_${Ip}_etc.tar.gz etc &>/dev/null
#判断备份是否成功
if [ $? -eq 0 ];then
echo "Success!"
else
echo "Failure..."
fi
3、案例三:在/oldboy目录下,存在很多文件,找出所有以.txt为结尾的文件
#批量重命名,将所有以.txt为结尾的文件重命名为.txt.bak
#把所有的.bak的文件打包压缩
#批量还原.bak的文件重命名为.txt
[root@shell /scripts]# touch /goudan/test{01..10}.txt
[root@shell /scripts]# touch /goudan/test{01..10}.log
?
#第一种方法
[root@shell /scripts]# cat mv.sh
#!/bin/bash
#把所有以.txt为结尾的文件重命名为.txt.bak
###方法一:sed###
find /goudan/ -type f -name "*.txt" | sed -r 's#(.*)#mv \1 \1.bak#g' | bash &>/dev/null
###方法二:awk##
find /goudan -type f -name "*.txt"|awk '{print"mv "$0" "$0".bak"}'
#判断重命名是否成功
if [ $? -eq 0 ];then
echo "所有.txt结尾文件已更改为.txt.bak"
else
echo "重命名失败!"
exit
fi
#将所有.bak的文件进行打包压缩
cd /goudan && tar czf bak.tar.gz $(find /goudan -type f -name "*.bak") &>/dev/null
#判断是否打包压缩成功
if [ $? -eq 0 ];then
echo "所有.bak文件已打包........"
else
echo "打包压缩失败!"
exit
fi
#还原名称
###方法一:sed###
find /goudan -type f -name "*.bak" | sed -r 's#(.*)(\.bak)#mv \1\2 \1#g' | bash &>/dev/null
###方法二:awk###
find /goudan -type f -name "*.bak"|awk -F '.' '{print "mv "$0" "$1"."$2}'|bash &>/dev/null
#判断还原名称是否成功
if [ $? -eq 0 ];then
echo "已将.bak文件还原为.txt!"
else
echo "还原名称失败!"
exit
fi
#方法三:for循环
[root@shell /scripts]# cat mv.sh
#!/bin/bash
# 批量修改.txt为.txt.bak
for i in $(find /backup -name "*.txt")
do
mv $i ${i}.bak
done
# 判断是否执行成功
if [ $? -eq 0 ];then
echo "将文件修改为.txt.bak成功"
else
echo "将文件修改为.txt.bak失败"
exit
fi
# 打包以.bak结尾的文件
cd /backup && tar czf bak.tar.gz $(find /backup -name "*.bak") &>/dev/null
# 判断打包是否成功
if [ $? -eq 0 ];then
echo "打包成功"
else
echo "打包失败"
exit
fi
# 将.bak结尾的文件还原为.txt
for j in $(find /backup -name "*.bak")
do
mv $j ${j%.*}
done
# 判断还原是否成功
if [ $? -eq 0 ];then
echo "成功将文件还原为.txt"
else
echo "还原失败"
fi
4. 案例四:把以下的字符串中长度小于5的打印出来
When find examines or prints information a file
# 方法一:
[root@shell /backup]# echo "When find examines or prints information a file"|xargs -n1|awk "{if(length<5)print}"
# 方法二:
[root@shell /scripts]# cat length.sh
#!/bin/bash
string='When find examines or prints information a file'
# 显示要打印的字符串
echo "$string"
# 打印长度小于5的字符串
for i in ${string}
do
[ ${#i} -lt 5 ] && echo $i
done
Shell变量运算
?加:num1 + num2
减:num1 - num2
乘:num1 * num2
除:num1 / num2
求余:num1 % num2
整数运算
?只支持整数运算,不支持小数运算
expr:数值之间必须要有空格进行分开,当使用*乘的时候,需要对其进行转义使用,不能进行求方运算
?
$(()):没有严格格式要求,不能进行求方运算
?
$[]:相当于$(()),没有严格格式要求,不能进行求方运算
?
let:计数
1. expr
[root@shell /scripts]# expr 1 + 1
2
[root@shell /scripts]# num1=10
[root@shell /scripts]# num2=5
[root@shell /scripts]# expr $num1 + $num2
15
[root@shell /scripts]# expr $num1 - $num2
5
[root@shell /scripts]# expr $num1 * $num2
expr: syntax error
[root@shell /scripts]# expr $num1 \* $num2
50
[root@shell /scripts]# expr $num1 / $num2
2
[root@shell /scripts]# expr $num1 % $num2
0
2. $(( ))
[root@shell /scripts]# echo $(($num1+$num2))
16
[root@shell /scripts]# echo $(( $num1 + $num2 ))
16
[root@shell /scripts]# echo $(( $num1 - $num2 ))
6
[root@shell /scripts]# echo $(( $num1 * $num2 ))
55
[root@shell /scripts]# echo $(( $num1 / $num2 ))
2
[root@shell /scripts]# echo $(( $num1 % $num2 ))
1
3. $[ ]
[root@shell /scripts]# echo $[$num1+$num2]
16
[root@shell /scripts]# echo $[1+1]
2
[root@shell /scripts]# echo $[ $num1 - $num2 ]
6
[root@shell /scripts]# echo $[ $num1 * $num2 ]
55
[root@shell /scripts]# echo $[ $num1 / $num2 ]
2
[root@shell /scripts]# echo $[ $num1 % $num2 ]
1
4. let
[root@shell /scripts]# a=10
[root@shell /scripts]# let a++
[root@shell /scripts]# let a++
[root@shell /scripts]# let a++
[root@shell /scripts]# echo $a
13
[root@shell /scripts]# let a--
[root@shell /scripts]# echo $a
12
[root@shell /scripts]# echo $a
12
[root@shell /scripts]# let a--
[root@shell /scripts]# echo $a
11
小数运算
小数计算命令:
?bc、awk、python
1. bc
[root@shell /scripts]# yum install -y bc
?
[root@shell /scripts]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+1
2
3/2
1
^C
(interrupt) Exiting bc.
[root@shell /scripts]# echo 10 + 20 | bc
30
[root@shell /scripts]# echo $num1 + $num2 | bc
16
[root@shell /scripts]# echo $num1 / $num2 | bc
2
[root@shell /scripts]# echo "scale=2;$num1 / $num2" | bc
2.20
[root@shell /scripts]# echo "scale=1;$num1 / $num2" | bc
2.2
[root@shell /scripts]# echo "scale=5;$num1 / $num2" | bc
2.20000
[root@shell /scripts]# echo "$num1 ^ $num2" | bc #求方运算
161051
2. awk
[root@shell /scripts]# awk 'BEGIN{print 10 + 5}'
15
[root@shell /scripts]# awk 'BEGIN{print 10 - 5}'
5
[root@shell /scripts]# awk 'BEGIN{print 10 * 5}'
50
[root@shell /scripts]# awk 'BEGIN{print 10 / 5}'
2
[root@shell /scripts]# awk 'BEGIN{print 10 % 5}'
0
[root@shell /scripts]# awk 'BEGIN{print 10 ^ 5}'
100000
[root@shell /scripts]# awk 'BEGIN{print 11 ^ 5}'
161051
[root@shell /scripts]# awk 'BEGIN{print 11 / 5}'
2.2
[root@shell /scripts]# awk 'BEGIN{print 10 / 3}'
3.33333
#第二种方法(除法)
[root@shell /scripts]# awk 'BEGIN{printf "%.3f\n",10/3}'
3.333
?#BEGIN 行处理前
[root@shell /scripts]# awk "BEGIN{print $num1/$num2}"
2.2
[root@shell /scripts]# awk -vnum1=10 -vnum2=5 'BEGIN{print num1/num2}'
2
?#-v #自定义内部变量
3. python
[root@shell /scripts]# python
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1+1
2
>>> 10^10
0
>>> 10/3
3
>>> 10.0/3
3.3333333333333335
>>>
KeyboardInterrupt
>>> quit
Use quit() or Ctrl-D (i.e. EOF) to exit
>>> quit()
[root@shell /scripts]# echo "print $num1 + $num2" | python
16
[root@shell /scripts]# echo "print $num1 - $num2" | python
6
[root@shell /scripts]# echo "print $num1 ^ $num2" | python
14
[root@shell /scripts]# echo "print $num1 / $num2" | python
2
[root@shell /scripts]# echo "print ${num1}.0 / $num2" | python
2.2
变量运算案例
案例一:ps aux命令下,求VSZ列的和
#方法一:bc
[root@shell /scripts]# ps aux | awk 'NR>1{print $5}' | xargs | tr ' ' '+' | bc
#方法二:awk
[root@shell /scripts]# ps aux | awk 'NR>1{i+=$5}END{print i}'
#方法三:for循环
#!/bin/bash
Vsz_Sum=0
#计算VSZ列的值
for i in $(ps -aux|awk 'NR>1{print $5}')
do
Vsz_Sum=$(($Vsz_Sum + $i))
done
#判断执行是否成功
if [ $? -eq 0 ];then
echo "$Vsz_Sum"
else
echo "请检查语法"
fi
案例二:写个脚本,实现一个简单的计算器,实现加减乘除(执行脚本时,提示输入第一个数字:10,提示输入第二个数字:20)
10 + 20 = 30
10 - 20 = -10
[root@shell ~]# cat cal.sh
#!/bin/bash
read -p "请输入第一个数字:" Num1
read -p "请输入第二个数字:" Num2
echo "$Num1 + $Num2 = $(( $Num1 + $Num2 ))"
echo "$Num1 - $Num2 = $(( $Num1 - $Num2 ))"
echo "$Num1 * $Num2 = $(( $Num1 * $Num2 ))"
echo "$Num1 / $Num2 = $(awk "BEGIN{ print $Num1 / $Num2 }")"
Shell变量案例
案例一:使用Shell脚本打印,系统版本、内核版本平台、虚拟平台、静态主机名、eth0网卡IP地址、lo网卡IP地址、当前主机的外网IP地址curl icanhazip.com
[root@shell /scripts]# cat var.sh
#!/bin/bash
Version=$(awk '{print $1,$4}' /etc/redhat-release)
Kernel=$(hostnamectl | awk '/Kernel/{print $3}')
Vm=$(hostnamectl | awk '/Virtua/{print $2}')
Static_Hostname=$(hostnamectl | awk '/hostname/{print $3}')
Eth0=$(ifconfig eth0 | awk 'NR==2{print $2}')
Lo=$(ifconfig lo | awk 'NR==2{print $2}')
Wan=$(curl -s ifconfig.me)
echo "当前系统版本号为:$Version"
echo "当前系统内核版本号为:${Kernel%.e*}"
echo "当前系统虚拟化平台为:$Vm"
echo "当前系统静态主机名为:$Static_Hostname"
echo "当前系统的Eth0网卡IP地址为:$Eth0"
echo "当前系统的Lo网卡IP地址为:$Lo"
echo "当前系统的外网IP地址为:$Wan"
案例二:需求描述:变量string="Bigdata process is Hadoop, Hadoop is open source project",执行脚本后,打印输出string变量,并给出用户以下选项:
#需求
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
用户请输入数字1|2|3|4,可以执行对应项的功能。
[root@shell /scripts]# cat var-1.sh
#!/bin/bash
#1.定义变量
String='Bigdata process is Hadoop, Hadoop is open source project'
#2.打印变量
echo $String
#3.输出菜单
cat<<EOF
1)打印string长度
2)删除字符串中所有的Hadoop
3)替换第一个Hadoop为Linux
4)替换全部Hadoop为Linux
EOF
#4.提示用户输入对应的数字,执行对应的功能
read -p "请输入上方菜单对应的数字,执行其对应的功能[1|2|3|4]:" Num
#5.根据用户输入的数字进行执行对应的功能
if [ $Num -eq 1 ];then
echo "正在打印变量String的长度....."
echo ${#String}
elif [ $Num -eq 2 ];then
echo "正在删除字符串中的所有Hadoop"
echo ${String//Hadoop/}
elif [ $Num -eq 3 ];then
echo "正在替换变量中第一个Hadoop为Linux"
echo ${String/Hadoop/Linux}
elif [ $Num -eq 4 ];then
echo "正在替换变量中的所有Hadoop为Linux"
echo ${String//Hadoop/Linux}
else
echo "你输入的数字不正确!请按照要求输入对应的数字!"
fi
相关推荐
- 3分钟让你的项目支持AI问答模块,完全开源!
-
hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...
- 干货|程序员的副业挂,12个平台分享
-
1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...
- Github标星超200K,这10个可视化面板你知道几个
-
在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...
- 开箱即用的炫酷中后台前端开源框架第二篇
-
#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...
- 搭建React+AntDeign的开发环境和框架
-
搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...
- 基于.NET 5实现的开源通用权限管理平台
-
??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...
- StreamPark - 大数据流计算引擎
-
使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...
- 教你使用UmiJS框架开发React
-
1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...
- 简单在线流程图工具在用例设计中的运用
-
敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...
- 【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单
-
这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...
- 聊聊规则引擎的调研及实现全过程
-
摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...
- 【开源推荐】Diboot 2.0.5 发布,自动化开发助理
-
一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...
- 微软推出Copilot Actions,使用人工智能自动执行重复性任务
-
IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...
- Electron 使用Selenium和WebDriver
-
本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...
- Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具
-
一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...
- 一周热门
- 最近发表
- 标签列表
-
- kubectlsetimage (56)
- mysqlinsertoverwrite (53)
- addcolumn (54)
- helmpackage (54)
- varchar最长多少 (61)
- 类型断言 (53)
- protoc安装 (56)
- jdk20安装教程 (60)
- rpm2cpio (52)
- 控制台打印 (63)
- 401unauthorized (51)
- vuexstore (68)
- druiddatasource (60)
- 企业微信开发文档 (51)
- rendertexture (51)
- speedphp (52)
- gitcommit-am (68)
- bashecho (64)
- str_to_date函数 (58)
- yum下载包及依赖到本地 (72)
- jstree中文api文档 (59)
- mvnw文件 (58)
- rancher安装 (63)
- nginx开机自启 (53)
- .netcore教程 (53)