shell编程--变量、算数运算、比较判断、[]和[[]]的区别

一、变量

1、自定义变量

命名规则:只能使用字母、数字和下划线,而且不可以使用数字开头,不能使用关键字。

1)定义变量:# name=”jiaofan”
2)引用变量:# $name
3)查看变量:# echo $name
4)取消变量:# unset name
5)查看所有变量:# set
6)从键盘输入数据:read  -p”输出内容”  name
7)三种引号的作用:””弱引
                ‘’强引
                ``优先执行

2、环境变量

  1. export 全局变量。
  2. 直接声明(子bash都能用):export back_dir=/home/backup
  3. 转换声明(子bash都能用):export back_dir 将自定义变量转换成环境变量
  4. 如果要一直使用:将变量加入到/etc/porfile文件中,

案例:设置JAVA的环境变量

[root@localhost jiaofan]# vi /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
[root@localhost jiaofan]# source /etc/profile

注:[root@localhost jiaofan]# vi ~/.bashrc 这个文件=/etc/profile,但是这里面的全局变量只能对本用户生效。

3、位置变量

1)命令 参数1 参数2 参数3 ....9以后特殊定义
    $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 .
【注】# 1.sh 1 2 3 4 $3只接受第3个参数。

案例:

[root@localhost jiaofan]# cat b.sh 
#!/bin/bash
echo "$0"
echo "$1"
echo "$2"

[root@localhost jiaofan]# ./b.sh jiao fan
./b.sh
jiao
fan

4、系统域变量

变量描述
UID当前帐户的账户ID号
USER当前帐户的账户名称
HISTSIZE当前终端的最大历史命令条目数量(最多可以记录多少条历史命令)
HOME当前帐户的根目录
LANG当前环境使用的语言
PATH命令搜索路径
PWD返回当前工作目录
RANDOM随机返回0到32767的整数
$0返回当前工作目录
$#参数的个数
$*所有的参数=$@
$@所有的参数=$*
$?上一个程序的返回值(0是成功,非零失败)
$$程序的PID
$!Shell最后运行的后台Process的PID
$-使用set命令设定的Flag一览

二、算数运算

算数运算有五种方式:

  1. $((表达式))
  2. $[表达式]
  3. let 表达式
  4. expr 1 + 2
  5. bc:计算小数
运算符号含义描述
++自加1
自减1
+加法
-减法
*乘法
/除法
**求幂
%取余
+=自加任意数
-=自减任意数
*=自乘任意数
/=自除任意数
%=对任意数取余
&&逻辑与
||逻辑或
>大于
>=大于或等于
<小于
<=小于等于
表达式1?表达式2:表达式3表达式1成立,执行表达式2,不成立执行表达式3

1、整数运算

[root@localhost jiaofan]# echo `expr 1 + 2`
3
[root@localhost jiaofan]# echo $((1+1))
2
[root@localhost jiaofan]# echo $[1+2]
3
[root@localhost jiaofan]# echo $[3>2?2+2:3*2]    <==因为3>2成立,所以执行2+2并输出。
4
[root@localhost jiaofan]# x=1;echo $[x++]         <==在输出x,先执行x=x+1
1
[root@localhost jiaofan]# x=1;echo $[++x]         <==先执行x=x+1,在输出x
2

2、小数运算

人机交互:

[root@localhost jiaofan]# 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.3+3.3
4.6
quit
[root@localhost jiaofan]# 

不用人机交互,可以在脚本中直接执行

[root@localhost jiaofan]# echo $((1+1))
2
[root@localhost jiaofan]# echo $(echo  "(1+2)*3" | bc)
9
[root@localhost jiaofan]# echo "2+3;8/19" | bc
5
.42

三、比较判断

1、整数的判断与比较

         [  20  -gt  10   ]  大于
         [  20  -lt  10   ]  小于
         [  20  -eq  10   ]  等于
         [  20  -ne  10   ]  不等于
         [  20  -ge  10   ]  大于等于
         [  20  -le  10   ]  小于等于

案例:

root@localhost jiaofan]# ./b.sh 
请输入您的密码:yui
您的密码太短!
[root@localhost jiaofan]# cat b.sh
#!/bin/bash
read -p "请输入您的密码:" ps
if [ ${#ps} -lt 7 ] 
then
echo "您的密码太短!"
else
echo "您的密码真长!"
fi

2、字符串判断与比较

[ ] 条件设计(内部空格,中括号两侧必须空格)

         test  a == a
         [  =   ] 等于
         [  !=   ] 不等于

案例:

[root@localhost jiaofan]#  [ abc == abc ] && echo Y  || echo N
Y
[root@localhost jiaofan]#  [ abc == ab ] && echo Y  || echo N
N
[root@localhost jiaofan]# echo $name
jiaofan
[root@localhost jiaofan]#  [ -z $name ] && echo Y  || echo N
N
[root@localhost jiaofan]# unset name
[root@localhost jiaofan]# echo $name

[root@localhost jiaofan]#  [ -z $name ] && echo Y  || echo N
Y
[root@localhost jiaofan]# 

3、不明确的错误一:等号两边要有空格,不然语法正确,逻辑不正确

[root@localhost jiaofan]#  [ abc==c ] && echo Y  || echo N
Y

4、不明确的错误二:

因为,当$name为空时,等同于执行了下面第一条指令,是在测试一个空格是否为空。按计算机的理解,空格也是有值的,并非没有值,所以有测试结果总为真;但是程序已经出错了,为了防止这样的错误,将变量用双引号引起来。

[root@localhost jiaofan]#  [ -n ] && echo Y  || echo N
Y
[root@localhost jiaofan]#  [ -n $name ] && echo Y  || echo N
Y
[root@localhost jiaofan]#  [ -n "$name" ] && echo Y  || echo N
N

3、文件属性的判断与比较

符号含义
-f filename当filename 存在时返回真
-b filename当filename 存在并且是块文件时返回真(返回0)
-d pathname当pathname 存在并且是一个目录时返回真
-h filename当filename 存在并且是符号链接文件时返回真 (或 -L filename)
-c filename当filename 存在并且是字符文件时返回真
-e pathname当由pathname 指定的文件或目录存在时返回真
-g pathname当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
-k pathname当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真
-p filename当filename 存在并且是命名管道时返回真
-r pathname当由pathname 指定的文件或目录存在并且可读时返回真
-s filename当filename 存在并且文件大小大于0 时返回真
-S filename当filename 存在并且是socket 时返回真
-t fd当fd 是与终端设备相关联的文件描述符时返回真
-w pathname当由pathname 指定的文件或目录存在并且可写时返回真
-x pathname当由pathname 指定的文件或目录存在并且可执行时返回真
-O pathname当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
-G pathname当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真
file1 -ef file2两个文件使用相同设备、相同inode编号,则返回真,否则返回假
file1 -nt file2file1比file2更新时返回真;或者file1存在而file2不存在时返回真
file1 -ot file2file1比file2更旧时返回真;或者file2存在而file1不存在时返回真

案例:

[root@localhost ~]# touch ver1.txt
[root@localhost ~]# touch ver2.txt
[root@localhost ~]# mkdir test
[root@localhost ~]# [ -e ver1.txt ] && echo 对  || echo 错    #<==判断是否存在[root@localhost ~]# [ -e test ] && echo 对  || echo 错     [root@localhost ~]# [ ! -e test ] && echo 对  || echo 错[root@localhost ~]# [ -f test ] && echo 对  || echo 错      #<==判断test是否为文件[root@localhost ~]# [ -d test ] && echo 对  || echo 错      #<==判断test是否为目录

四、[]和[[]]的区别

[[]] 测试[] 测试
< 排序不支持 (仅部分shell解释器支持<)
> 排序比较不支持(仅部分shell解释器支持>)
&& 逻辑与-a 逻辑与
|| 逻辑或-o 逻辑或
== 匹配模式== 字符匹配
=~ 正则匹配不支持
()分组测试()仅部分sehll解释器支持分组测试
[root@localhost ~]# [ $name =~ [a-c] ] && echo 对  || echo 错
-bash: [: =~: 期待二元表达式
错
[root@localhost ~]# [[ $name =~ [a-c] ]] && echo 对  || echo 错[root@localhost ~]# [[ $name =~ j ]] && echo 对  || echo 错[root@localhost ~]# [[ $name =~ [0-9] ]] && echo 对  || echo 错
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值