shell之 变量及其运算

一、环境变量

环境变量也可叫全局变量,可以在创建他们的shell及派生出的子shell中使用(无需定义,直接可以使用,如:$UID)
相关命令:

  • set :输出所有变量

  • env:只显示全局变量

  • declare:输出所有变量,函数,整数等

[root@fuwu test]# echo $UID
0
[root@fuwu test]# echo $SHELL
/bin/bash
[root@fuwu test]# echo $set

[root@fuwu test]# echo $declare

[root@fuwu test]# echo $HOME
/root

二、普通变量

  1. 普通变量赋值
    变量名=value
    变量名=‘value’
    变量名=“value”
    没有特殊要求时,字符串都加双引号,需要原样输出就用单引号
    ’ ’ 为强引用
    “ ” 为弱引用 · ! $ ? \ 不能引用
[root@fuwu test]# a=hello
[root@fuwu test]# echo $a
hello
[root@fuwu test]# b='hello'
[root@fuwu test]# echo $b
hello
[root@fuwu test]# c="hello"
[root@fuwu test]# echo $c
hello
[root@fuwu test]# a=ni hao
bash: hao: command not found...
[root@fuwu test]# a="ni hao"                 ##定义的变量内容有空格时要加“ ”
[root@fuwu test]# echo $a
ni hao
[root@fuwu test]# a=linux-$a             ##加双引号和什么都不加时,输出的是带转译的
[root@fuwu test]# echo $a
linux-ni hao
[root@fuwu test]# b='linux-$b'            ##单引号是原样输出不带转译
[root@fuwu test]# echo $b
linux-$b
[root@fuwu test]# c="linux-$c"
[root@fuwu test]# echo $c
linux-hello
  1. 命令结果作为内容赋值

    变量名=`命令`
    b=`ls`或 b=$(ls)
    
[root@fuwu test]# A=`ls -l`
[root@fuwu test]# echo $A
total 860 -rwxr-xr-x. 1 root root 820 Dec 26 22:00 http.sh -rw-r--r--. 1 root root 206 Dec 26 03:57 jisuan.sh -rw-r--r--. 1 root root 860948 Dec 26 03:41 log_2018-12-26.tar.gz -rw-r--r--. 1 root root 417 Dec 26 21:57 log.sh -rw-r--r--. 1 root root 58 Dec 26 03:32 test.sh
[root@fuwu test]# B=$(ls)
[root@fuwu test]# echo $B
http.sh jisuan.sh log_2018-12-26.tar.gz log.sh test.sh
[root@fuwu test]# 

三、特殊变量

  1. $0:获取shell脚本文件名,如果执行时包含路径,则输出脚本路径
  2. $n(>0):获取脚本的第n个参数
  3. $#:获取脚本后参数的总个数
  4. $*:获取所有参数,后面所有字符是一个整体
  5. $@:获取所有参数,后面的字符是单个的算的,一共有几个输出几个
  6. $?:获取上一条命令执行状态的返回值,0为成功,非0为失败
  7. $$:获取当前shell进程号
[root@fuwu test]# vim test.sh
[root@fuwu test]# cat test.sh 
#!/bin/bash
echo $0                         ##获取shell脚本文件名
[root@fuwu test]# sh test.sh 
test.sh                                ###执行时不包含路径,则输出脚本名
[root@fuwu test]# sh /test/test.sh 
/test/test.sh                     ###执行时包含路径,则输出脚本路径
[root@fuwu test]# cat test.sh 
#!/bin/bash
echo $1 $2                     ###获取脚本的第1和2个参数
[root@fuwu test]# sh test.sh aa bb
aa bb
[root@fuwu test]# cat test.sh 
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
[root@fuwu test]# sh test.sh  {a..j}
a b c d e f g h i a0
[root@fuwu test]# sh test.sh  {a..z}
a b c d e f g h i a0
[root@fuwu test]# cat test.sh 
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}      ###获取脚本的第1-10个参数
[root@fuwu test]# sh test.sh  {a..z}
a b c d e f g h i j
[root@fuwu test]# cat test.sh 
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
echo $#
[root@fuwu test]# sh test.sh  {a..z}
a b c d e f g h i j
26
[root@fuwu test]# cat test.sh 
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
echo $*                       ###获取所有参数
[root@fuwu test]# sh test.sh  {a..z}
a b c d e f g h i j
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@fuwu test]# cat test.sh 
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
echo $@                         ####获取所有参数
[root@fuwu test]# sh test.sh  {a..z}
a b c d e f g h i j
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@fuwu etc]# ls hosts
hosts
[root@fuwu etc]# echo $?         ####上一条命令执行状态的返回值,0为成功
0 
[root@fuwu etc]# ls host
ls: cannot access host: No such file or directory
[root@fuwu etc]# echo $?
2                                            ###上一条命令执行状态的返回值,非0为失败

四、shell中的数值计算

  1. 使用expr命令
[root@fuwu test]# a=11
[root@fuwu test]# expr $a + 22
33
[root@fuwu test]# expr $a - 2
9
[root@fuwu test]# expr $a * 2
expr: syntax error
[root@fuwu test]# expr $a \* 2           ##乘法符号需要转译
22
[root@fuwu test]# expr $a / 2
5
[root@fuwu test]# expr $a % 2
1
  1. [ ] 和 []和 [](())表达式
[root@fuwu test]# echo $[a+100]
111
[root@fuwu test]# echo $[a-1]
10
[root@fuwu test]# echo $[a*22]
242
[root@fuwu test]# echo $[a/2]
5
[root@fuwu test]# echo $[a%2]
1
[root@fuwu test]# echo $((a%2))
1
  1. let命令(此命令在执行后会保存新的值)
[root@fuwu test]# let a+=22      ###a加20后值赋给a
You have new mail in /var/spool/mail/root
[root@fuwu test]# echo $a
33
[root@fuwu test]# let a-=10
[root@fuwu test]# echo $a
23
[root@fuwu test]# let a*=10
[root@fuwu test]# echo $a
230
[root@fuwu test]# let a/=10
[root@fuwu test]# echo $a
23
[root@fuwu test]# let a%=10
[root@fuwu test]# echo $a
3
  1. 小数计算 | bc
[root@fuwu test]# echo "scale=5;1.234*2.11" | bc     ##保留5位小数
2.60374
[root@fuwu test]# echo 1.2+2.3 | bc
3.5

例:编写一个可以计算两位加减乘除的脚本

[root@fuwu test]# cat jisuan.sh 
#!/bin/bash

read -t 20 -p "请输入两个数:" a b       ### -t  20  表示20秒内没输入就退出

echo "a+b=$(echo $a+$b | bc)"
echo "a-b=$(echo $a-$b | bc)"
echo "a*b=$(echo $a*$b | bc)"
echo "a/b=$(echo $a/$b | bc)"
echo "a%b=$(echo $a%$b | bc)"
[root@fuwu test]# sh jisuan.sh
请输入两个数:2.1 2.3
a+b=4.4
a-b=-.2
a*b=4.8
a/b=0
a%b=2.1

五、read命令

[root@fuwu test]# read str
ni hao
[root@fuwu test]# echo $str
ni hao
[root@fuwu test]# read -p "你好呀:" a
你好呀:小可爱
[root@fuwu test]# echo $a
小可爱

read 后面加 -s 是给输入的字符加密
例:

[root@squid mnt]# read -p "Please input passwd" -s passwd
Please input passwd

例:打包压缩,将log下的所有文件打包成 log_时间.tar.gz的形式

[root@fuwu test]# date
Wed Dec 26 03:41:26 EST 2018
[root@fuwu test]# tar zcf log_$(date +%F).tar.gz /var/log/
tar: Removing leading `/' from member names
[root@fuwu test]# ls
http.sh  log_2018-12-26.tar.gz  test.sh

六、不同级别的应用

``比较通用
$()不通用,适用场景比较少

  1. 系统级的:被写在系统的配置文件/etc/profile或者/etc/profile.d/中,对于所有用户都生效。

     [root@localhost mnt]# vim /etc/profile
     [root@localhost mnt]# source /etc/profile
     [root@localhost mnt]# echo $a
     3
    
  2. 用户级的:写在用户的骨文件(~/.bash_profile)中,只针对当前用户有效

     [root@localhost mnt]# vim ~/.bash_profile 
     		 export a=1
     [root@localhost mnt]# source ~/.bash_profile 
     [root@localhost mnt]# echo $a
     1
    
  3. 环境级的:只在当前shell中生效,shell关闭后变量丢失
    例:只在shell中

     [root@localhost mnt]# a=1
     [root@localhost mnt]# echo $a
     1
    

但是这样在脚本中加载a时,就会显示报错,此时定义a=1应该用以下形式

[root@localhost mnt]# export a=1
[root@localhost mnt]# /mnt/test.sh
1

变量也可以不是数

[root@localhost mnt]# export a=`hostname`
[root@localhost mnt]# /mnt/test.sh
localhost
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值