一文彻底弄懂Linux-Shell编程

Posted Maynor996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文彻底弄懂Linux-Shell编程相关的知识,希望对你有一定的参考价值。

一、Shell 编程之条件结构

1Shell 条件测试语法

test 测试表达式

利用test命令进行条件测试表达式,  test命令与测试表达式之间至少有一个空

[ 试表达式 ]

通过[ ]中括号进行条件测试表达式,  []中括号边界与测试表达式之间至少有一个空格

[[ 测试表达式 ]]

通过[[ ]]双中括号进行条件测试表达式,  [[ ]]双中括号与测试表达式之间至少有一个空格

((测试表达式))

通过(( ))双小括号进行条件测试表达式,  ( ))双小括号两端不需要空格,  常用于整数

1、符号说明

su: syntax error near unexpected token ` '

[root@qfedu.com ~]# var=notest;echo $var;

notest

[root@qfedu.com ~]# echo $var

notest

# 修改了变量的值。表明在当前shell中运行的

[root@qfedu.com ~]# var=test

[root@qfedu.com ~]# echo $var

test

[root@qfedu.com ~]# (var=notest;echo $var)

notest

[root@qfedu.com ~]# echo $var

test

#  ()  里的执行完毕后没有改变变量的值,  说明在子shell中执

# $(( ))$[ ]的用途一致 ,用来作整数运算。在  bash 中,  $(( ))的整数运算符号大致有这些: # + ‐ * / 加、减、乘、除

# % 余数运

# & | ^ ! ANDORXORNOT

举例:

[root@qfedu.com ~]# a=5; b=7; c=2

[root@qfedu.com ~]# echo $((a+b*c))

[root@qfedu.com ~]# echo $[a+b*c]

[root@qfedu.com ~]# echo $(((a+b)/c))

[root@qfedu.com ~]# echo $[(a+b)/c]

6

[root@qfedu.com ~]# echo $(((a*b)%c))

[root@qfedu.com ~]# echo $[(a*b)%c]

1

# $(( ))中的变量名称也可以在其前面加  $ 符号:  $(($a+$b*$c))也可以得到  19 的结果。

# $(( ))还可以作不同进制(如二进制、八进位、十六进制)运算,  只是输出结果皆为十进制而已。

[root@qfedu.com ~]# echo $((16#2a))  # 16进位转十进制

42

# 当前的  umask 是  022,  新建文件的权限为:

[root@qfedu.com ~]# umask 022

[root@qfedu.com ~]# echo "obase=8; $(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc

[root@qfedu.com ~]# 644

# 单纯用(( ))也可以重定义变量值,  或作testing

[root@qfedu.com ~]# a=5

[root@qfedu.com ~]# echo $((a++))

# 将  a 重定义为  6

双中括号[[ ]]中可以使用通配符进行匹配,  这是其区别于其它几种语法的地方

&&,   | |,  <,  >等操作符可用于双中括号[[ ]]中,  但不能应用于[ ]中,  在[ ]中一般用-a,  -o,  -lt,  -gt来代替

举例

[root@qfedu.com ~]# test ‐f /tmp/test.txt && echo 1 | | echo 0

[root@qfedu.com ~]# [ ‐f /tmp/test.txt ] && echo 1 | | echo 0

[root@qfedu.com ~]# [[ ‐f /tmp/test.txt ]] && echo 1 | | echo 0

[root@qfedu.com ~]# ((3>2)) && echo 1 | | echo 0

2获取帮助

[root@qfedu.com ~]# man test

2Shell 测试表达式用法

1文件测试表达式

-d 文件

文件存在且为目录则为真

-f 文件

文件在且为普通文件则为真

-e 

文件存在则为真,  不辩别是目录还是文件

-s 

文件存在且文件大小不为0则为

-r 

文件存在且可读则为真,  与执行脚本的用户权限也有关

-w 文件

文件存在且可写则为真,  与执行脚本的用户权限也有关

-x 文件

文件存在且可执行则为真,  与执行脚本的用户权限也有关

-L 文件

文件在且为链接文件则为真

f1 -nt f2

文件f1比文件f2新则为真,  根据文件的修改时间计算

f1 -ot f2

文件f1比文件f2旧则为真,  根据文件的修改时间计算

  件测试 [ 操作符 文件或目录 ]

[root@qfedu.com	~]# test ‐d /home
[root@qfedu.com	~]# echo $?
0	
[root@qfedu.com	~]# test ‐d /home11111
[root@qfedu.com	~]# echo $?
1	
[root@qfedu.com	~]# [ ‐d /home ]
[root@qfedu.com	~]# [ ! ‐d /ccc ]  && mkdir /ccc
[root@qfedu.com	~]# [ ‐d /ccc ]  | | mkdir /ccc

2、字符串测试表达式

# 提示:  字符串必须使用双引号
[root@qfedu.com  ~]# [ "$USER" = "root" ];echo $?
0
[root@qfedu.com  ~]# [ "$USER" == "root" ];echo $?
0
[root@qfedu.com  ~]# BBB=""
[root@qfedu.com  ~]# echo $#BBB
0
[root@qfedu.com  ~]# [ ‐z "$BBB" ]
[root@qfedu.com  ~]# echo $?
0
[root@qfedu.com  ~]# [ ‐n "$BBB" ]
[root@qfedu.com  ~]# echo $?
1
[root@qfedu.com  ~]# var2=
[root@qfedu.com  ~]#
[root@qfedu.com  ~]# echo $#var1
3
[root@qfedu.com  ~]# echo $#var2
0
[root@qfedu.com  ~]# echo $#var3
0
[root@qfedu.com  ~]# [ ‐z "$var1" ];echo $?
1
[root@qfedu.com  ~]# [ ‐z "$var2" ];echo $?
0
[root@qfedu.com  ~]# [ ‐z "$var3" ];echo $?
0
[root@qfedu.com  ~]# [ ‐n "$var1" ];echo $?
0
[root@qfedu.com  ~]# [ ‐n "$var2" ];echo $?

参数

-z

1

如果字符串s1的长度为0,  则测试条件为真

-n

1

如果字符串s1的长度大于0 则测试条件为真

sl

如果字符串s1不是空字符串,  则测试条件为真

===

s1=s2

如果s1等于s2,  则测试条件为真,“=”前后应有空格

!=

s1!=s2

如果s1不等于s2,  则测试条件为真

<

1

如果按字典顺序s1s2之前,  则测试条件为真

>

s1>s2

如果按自定顺序s1s2之后,  则测试条件为真

1、注意

  对于字串的比较,  一定要将字符串加比引号后再比较。如[ -n "$string" ]

   =!=可用于判断两个字符串是否相

2、字符串比较

# 提示:  字符串必须使用双引号
[root@qfedu.com  ~]# [ "$USER" = "root" ];echo $?
0
[root@qfedu.com  ~]# [ "$USER" == "root" ];echo $?
0

[root@qfedu.com  ~]# BBB=""
[root@qfedu.com  ~]# echo $#BBB
0
[root@qfedu.com  ~]# [ ‐z "$BBB" ]
[root@qfedu.com  ~]# echo $?
0
[root@qfedu.com  ~]# [ ‐n "$BBB" ]
[root@qfedu.com  ~]# echo $?
1
[root@qfedu.com  ~]# var2=
[root@qfedu.com  ~]#
[root@qfedu.com  ~]# echo $#var1
3
[root@qfedu.com  ~]# echo $#var2
0
[root@qfedu.com  ~]# echo $#var3
0
[root@qfedu.com  ~]# [ ‐z "$var1" ];echo $?
1
[root@qfedu.com  ~]# [ ‐z "$var2" ];echo $?
0
[root@qfedu.com  ~]# [ ‐z "$var3" ];echo $?
0
[root@qfedu.com  ~]# [ ‐n "$var1" ];echo $?
0
[root@qfedu.com  ~]# [ ‐n "$var2" ];echo $?

3数操作符

[]test中使

[[ ]](( ))中使用

-eq

===

,  全拼为equal

-nq

!=

不等于,  全拼为not equal

-gt

>

大于,  全拼为greater than

-ge

>=

大于等于,  全拼为greater equal

-lt

<

小于,  全拼为less than

-le

<=

小于等于,  全拼less equal

1、判断变量是不是数字

[root@qfedu.com  ~]# num10=123

[root@qfedu.com  ~]# num20=ssss1114ss

[root@qfedu.com  ~]# [[ "$num10" =~ ^[0 ‐9]+$ ]];echo $?

0

[root@qfedu.com  ~]# [[ "$num20" =~ ^[0 ‐9]+$ ]];echo $?

1

[root@qfedu.com  ~]# disk_use=$(df ‐P |grep '/$ ' |awk 'print $5 ' |awk ‐F% 'print $1 ') [root@qfedu.com  ~]# [ $disk_use ‐gt 90 ] && echo "war......"

[root@qfedu.com  ~]# [ $disk_use ‐gt 60 ] && echo "war......"

war......

[root@qfedu.com  ~]# id ‐u

0

[root@qfedu.com  ~]# [ $(id ‐u) ‐eq 0 ] && echo "当前是超级用户"

前是超级用户

[alice@qfedu.com  ~]$ [ $UID eq 0 ] && echo "当前是超级用户" | | echo "you不是超级用" you是超级用户

3C语言风格的数值比较

[root@qfedu.com  ~]# ((1<2));echo $?

0

[root@qfedu.com  ~]# ((1==2));echo $?

1

[root@qfedu.com  ~]# ((1>2));echo $?

1

[root@qfedu.com  ~]# ((1>=2));echo $?

1

[root@qfedu.com  ~]# ((1<=2));echo $?

0

[root@qfedu.com  ~]# ((1!=2));echo $?

一文彻底弄懂Linux-Shell编程

一文让你彻底弄懂MySQL自增列

一文彻底弄懂 “CommonJs” 与 “EsModule” 区别

GIS风暴一文彻底弄懂数字地形(DEMDOMTDOMDSM)的区别与联系

GIS风暴一文彻底弄懂数字地形(DEMDOMTDOMDSM)的区别与联系

Cookie 从入门到进阶:一文彻底弄懂其原理以及应用

(c)2006-2024 SYSTEM All Rights Reserved IT常识