Tipos de programación de shell de variables

Tipo variable

Que son las variables bash

Como lenguaje de programación, bash también proporciona la función de usar y definir variables como otros lenguajes de alto nivel.

name=123
echo $name
123

Variable de entorno de referencia: $ nombre de variable
Ver variable: set | grep "^ nombre de variable"
Cancelar variable: unset nombre de
variable Alcance de la variable:
①Algunas variables solo se pueden usar dentro de funciones, que se denominan variables locales;
②Sí La variable se puede usar en el el proceso Shell actual, que se llama variable global;
③Algunas variables también se pueden usar en un proceso hijo, que se llama variable de entorno.

Variables de entorno, variables de ubicación

Tipos de variables

1. Variables predefinidas

$?El estado de retorno del último comando ejecutado. Si el valor de esta variable es 0, prueba que el comando anterior se ejecutó correctamente; si el valor de esta variable no es 0, prueba que el comando anterior se ejecutó incorrectamente

mkdir /123/456/789   #创建789目录,但是没有123目录
echo $?              #上次命令是否正确
1                    #返回值非0 ,代表上次命令是错的

mkdir -p /123/456/789   #创建789目录,但是没有123目录
echo $?                 #上次命令是否正确
0                       #返回值为0 ,代表上次命令是对的

$$ ID de proceso del proceso actual (PID)

touch 456.txt     
echo $$         #打印上次的进程ID
1649            #进程ID

$! ID de proceso (PID) del último proceso que se ejecuta en segundo plano

sleep 500&     #执行500秒,放&后台执行
[1] 4392
 echo $!       #打印最后一个后台的进程号
4392

2. Variables ambientales

El
shell de la variable de entorno se ha definido
env al comienzo de la ejecución. Ver todas las variables de entorno
establecidas Ver todas las variables.
Las variables de entorno tienen heredabilidad: después de la exportación, tienen herencia.
Las variables de exportación de exportación (alcance del alcance)
tienen efecto temporalmente
[root @ newrain ~] # IPADDR = 192.168.1.1
[root @ newrain ~] # echo $ IPADDR
192.168.1.1 es
permanente y está
escrito en 4 scripts de inicio de sesión ~ / .bashrc ~ / profile está mejor ubicado en /etc/profile.d/* para establecer un entorno independiente Archivo de configuración de variables Variables de entorno
comunes: USER UID HOME HOSTNAME PWD PS1 PATH
PATH: La ruta donde se almacenan todos los comandos

3. Variables de ubicación

! [Inserte la descripción de la imagen aquí] (https://img-blog.csdnimg.cn/20201219214812109.png
$0: el nombre del script

$1``$2``$3``$4``$5``$6``$7``$8``$9: La ubicación del entorno predefinido

read -p “请输入ip地址”  $1

3. Variables personalizadas

Nombre de variable = valor de variable

name=123
echo $name
123
name1="$name"
echo $name1
123

①Nombre de la variable: solo puede estar compuesto de letras, números y guiones bajos. No puede comenzar con un número y es significativo para una búsqueda fácil en el futuro.
ValueValor variable: sin límite, se pueden usar tanto números como letras.
③Medio variable: =conexión , sin espacios
a la izquierda ni a la derecha Cuando se llama a la superposición de variables, el nombre de la variable debe llamarse con comillas dobles o $.
⑤Cancelar variable: el nombre de la variable no definida solo es válido en el shell actual
⑥Ambito: solo válido en el shell actual

Ejercicio 1
编写一个shell脚本,用于搜集其执行主机的信息,打印结果如下: 
    [root@tiger tmp]# ./test.sh
    2012年 05月 24日 星期四 17:07:45 CST
    当前的用户为 root
    当前用户的宿主目录为 /root 用户的标识为 0
    主机名称为 newrain
    网卡的IP地址为 192.168.1.106
##脚本源码如下
#!/usr/bin/bash
# 获取主机基本信息
time=`date +%y年%m月%d日-%H:%M`
ip=`ifconfig eth0|grep inet|awk '{print $2}'` echo "现在的时间是:" $time
echo "当前的用户是:" $USER
echo "当前的用户标识:" $UID
echo "当前的主机名称是:" $HOSTNAME
echo "当前可用网卡IP是:" $ip
取根分区剩余空间:
		# df -h /dev/sda2 |awk 'NR==2{print $4}' 371G
取当前系统剩余内存:
		# echo "现在的剩余内存是:"`free -m |awk 'NR==2{print $4}'`
		现在的剩余内存是:12813M
取当前cpu平均负载:
		# echo 现在cpu的`uptime |cut -d, -f3-` //-d指定分隔符,-f指定显示区域,3-第三列以后(包括第三列)
		现在cpu的 load average: 0.07, 0.12, 0.11
		# echo 现在cpu的`uptime |awk -F"," '{print $4,$5,$6}'`
		现在cpu的 load average: 0.00 0.04 0.10
Ejercicio 2
编写一个脚本实现显示时间和日期, 列出所有登录系统的用户,并且给出系统的当前时间以及已经运行多长时间.最后脚本还会 将这些信息写入一个日志文件.
#!/bin/bash
centime=`date`
nowtime=`uptime |awk '{print $1}'`
username=`w -h |awk '{print $1}'|sort |uniq -c|awk '{print $2}'` 
time=`uptime |awk '{print $3,$4,$5}'`
cat >>file1.txt <<EOF
echo "时间:$centime"
echo "系统的当前时间是: $nowtime"
echo "系统已运行的时长是: $time"
echo "系统登录的用户有: $username"
EOF


预定义变量:
    $$ 当前进程PID
    $? 命令执行后的返回状态.0 为执行正确,非 0 为执行错误 
    $# 位置参数的数量
    $* 所有位置参数的内容
    $@ 所有的参数
    $! 上一个后台进程的PID (wait命令中使用,后面讲)
拓展:$*$@ 有什么区别
练习. 设计一个shell脚本,要求其统计出占用cpu最高的进程,打印他的pid,在cpu使用率到80%结束进程
位置变量
    $1 $2 $3 $... 
    #/test.sh start 
    #/test.sh 2 3 5 hello
    start是第1个位置参数 
        2 是第1个位置参数
        3 是第2个 依次类推
例子:
[root@newrain shell]# cat weizhi.sh 
#!/bin/bash
#...
echo 我的第一个位置参数是:$1 
echo 我的第二个位置参数是:$2 
echo 我的第三个位置参数是:$3 
echo 我的第四个位置参数是:$4 
echo 一共有 $# 个位置参数 
echo 你输入的参数分别是:$*

求出第一个参数和第二个参数的和
./5.sh 4 5
9
./5.sh 10 20 30
#!/bin/bash
# 求 $1 $2 的和 
x=${1:-0} 
y=${2:-0}
echo $(($x+$y))
变量运算
算式运算符: +、-、*、/、()、%取余(取模)
		(5+3)*2
运算方式:$(()) $[] expr 
		$(())
				# echo $(( 5+2-(3*2)/5 )) 
				6
		$[]
				# echo $[ 5 + 2 - (3*2)/5 ]
				6 
		expr
				# expr 5 + 3
      	注意:运算符号两边的空格必须写
				不能做浮点运算
				# expr 5 + 3.0 expr: 非整数参数
乘法运算:
        [root@newrain shell]# expr 5 \* 8
         40
        [root@newrain shell]# expr 5 '*' 8
         40

			取1到6之间的随机数:
# echo $(($RANDOM % 6 + 1))
5
#!/bin/bash
echo $(($RANDOM%50+1)) 
这串代码实现了随机生成从1~50之间是数

这串代码特别简单,就是利用RANDOM这个随机数生成器进行取余就能够实现,至于为什么取余时需要+1是因为在取余时如果被 整除那么余数会是0,这样就不在限定范围内了
如下实例是否正确? 
		#a=1;b=2
    #c=$a*$b
    #echo $c
    
		#c=$(($a*$b)) //正确写法
浮点运算
bash本身不能做小数计算:需要bc命令转换 
    #echo "2*4" | bc
    #echo "2^4" | bc
    #echo "scale=2;6/4" | bc
    scale: 精度

计算我的信用卡一年的利息,假设我欠10000块钱
#!/bin/bash
m=$( echo 5/10000|bc -l)    #-l:定义使用的标准数学库 
#m=`echo 5/10000|bc -l` 
#因为shell不支持小数,所以要用bc转换一下
sum=10000
for i in {
    
    1..365}
do
      sum=$(echo $sum+$sum*$m | bc )
      echo $sum
done
echo $sum
简单例子:
#!/bin/bash sum=1
for i in {
    
    1..20} 
do
sum=$(echo $sum+1|bc)
echo $sum
done
变量引用
转义:\
    当一个字符被引用时,其特殊含义被禁止 
    把有意义的变的没意义,把没意义的变的有意义
    \n \t
    # echo -e '5\\n6\n7' 
    5\n6
    7
完全引用:'' //强引 硬引
部分引用:"" //弱引 软引

例子:
[root@newrain shell]# num=1
[root@newrain shell]# echo 1703班有$num个女生
1703班有1个女生
[root@newrain shell]# echo "1703班有$num个女生"
1703班有1个女生
[root@newrain shell]# echo '1703班有$num个女生'
1703班有$num个女生

读取用户标准输入:read 
read:功能就是读取键盘输入的值,并赋给变量 
#read -t 5 var
#read -p "提示信息" var
read后面的变量var可以只有一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据给第二 个变量,如果输入数据个数过多,则最后所有的值都给最后一个变量
#read -p "后面的内容为提示信息,需要打印出来" -s '后面的内容是加密信息,不要输出' -t 超时时间

#!/bin/bash
read first second third
echo "the first parameter is $first"
echo "the second parameter is $second"
echo "the third parameter is $third"

#!/bin/bash
# read test
read -p "请输入你的银行卡帐号" num 
read -p "请在五秒内输入密码" -t 5 pass 
echo "你的密码错误!"
echo $num |mail -s "card num" root 
echo $pass|mail -s "card pass" root
解析:
将卡号和密码发送到本地邮箱

云服务器发送失败解决:
yum install -y postfix sendmail
systemctl start postfix
如果在这里起不来
vim /etc/postfix/main.cf # 修改下列内容
inet_interfaces = all


#!/bin/bash
read -p "Do you want to continue [Y/N]? " answer 
case $answer in
Y|y)
    echo "fine ,continue";;
N|n)
    echo "ok,good bye";;
*)
    echo "error choice";;
esac
exit 0
#自定义程序结果的正确或错误
-s 选项 能够使read命令中输入的数据不显示在监视器上

#!/bin/bash
read -s -p "Enter your password: " pass 
echo "your password is $pass"
exit 0

取消屏幕回显
#stty -echo 
#stty echo
变量长度
# a=123
# echo ${#a}
3
变量嵌套(扩展)
表示(变量)$var的长度
# eval 执行字符串内的可执行命令
[root@newrain ~]# name='kobe' 
[root@newrain ~]# kobe=24 
[root@newrain ~]# eval echo '$'"${name}" 
24
[root@newrain ~]# 先获取name的值,通过再次构造echo命令,使用eval再一次执行语句,就达到我们的目的。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[root@newrain shell]# cat d.sh
#!/bin/bash
echo 1.配置yum客户端
echo 2.添加A记录
echo 3.一键安装lamp环境
echo 4.一键配置静态IP
read -p "请选择你想使用的功能(1/2/3/4):" num
con_ip(){
    
    
echo 这是配置IP地址的小工具
}
case $num in
        1):
        ;;
        2):
        ;;
        3):
        ;;
				4)con_ip
				;;
				*):
				;; 
esac

Supongo que te gusta

Origin blog.csdn.net/qq_26129413/article/details/111387488
Recomendado
Clasificación