Linux之bash脚本编程---if补充和for循环

简介:

if 单分支、双分支、多分支、嵌套if语句

for 列表表示

    1、给出列表

    2、{1..100}

    3、命令引用:

        1)$(ls DIR)

        2)$(1 1 100)

    4、glob

    5、$*,$@

condition   
declare -i -r -x

readonly

export ,env

set,printenv,env,export,readonly -p



bash:过程式编程,为了完成更复杂的任务,支持顺序执行、选择执行、循环执行

  顺序执行:从左而右,依次执行命令。

  选择执行:依据condition(条件)的执行状态结果,选择执行不同的代码片段。

  循环执行:依据condition(条件)的执行状态结果,决定是否进入循环。

  

condition:

   ture: 表示条件状态结果为0

   false: 表示条件执行状态结果非0


if

   单分支、双分支、多分支、嵌套if语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1、单分支结构
if  condition;  then
     if -ture
fi
 
2、双分支结构
if  condition;  then
     if -ture
else
     if - false
fi
 
3、多分支结构
if  condition;  then
     if -ture
elif  condition;  then
     if -ture
elif  condition;  then
     if -ture
     ....
else
     all- false
fi
 
4、嵌套 if 语句
if  condition;  then
     if  condition;  then
         if -ture
     fi
fi
 
if  condition;  then
     if  condition;  then
         if -ture
     fi
else
     if  condition;  then
         if -ture
     fi   
fi


for


列表循环

格式

1
2
3
4
5
6
7
8
9
10
11
12
13
1、格式一
for  变量名  in  列表;  do
     循环体
done
 
2、格式二
for  变量名  in  列表
do
     循环休
done
 
3、格式三,命令行中
for  变量名  in  列表;  do  循环体;  done

列表表示方法

    1、给出列表

    2、{首位..尾数} ,例如 1到100表示为" {1..100}"

    3、命令引用:

        1)$(ls DIR)

        2)$(expr [首数 [步长]] 尾数),例如 1到100表示为"$(1 1 100)"

    4、通配符, glob . 例如 /var目录下一级子目录中的所有文件和目录的绝对路径。/var/*

    5、变量引用。 $* 向脚本传递的所有参数,整体。$@向脚本传递的所有参数,每个独立

    

脚本格式

1
2
3
4
#!/bin/bash
# Version: major.minor.release
# Author:
# Desc:


脚本语法检测

1
# bash -n file.sh


调试脚本

1
# bash -x file.sh


记录脚本退出状态码

1
INTEVAL=$? (变量引用实现赋值)


用户邮箱位置

1
/var/mail


定义变量的类型

1
整型:  # declare -i var


定义变量

1
2
3
4
5
6
7
8
1、环境变量
# env var
# declare -x var
# export var
 
2、只读变量
# declare -r var
# readonly var

显示本地和环境变量

1
# set

显示环境变量

1
2
3
# export
# env
# printenv


显示只读变量

1
# readonly -p


示例一:交互式给出一个文件路径,判断文件的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
# Version: 0.0.1
# Author: Lcc.org
# Description:testing
 
read  -t 5 -p  'Enter a file path: '  filename
 
if  [ -z  "$filename"  ];  then
     echo  "Enter a file path"
     exit  1
fi
 
if  [ ! -e $filename ];  then
     echo  "No such file."
     exit  2
fi
 
if  [ -f $filename ];  then
     echo  "Common file."
elif  [ -h $filename ];  then
     echo  "Symbolic file."
elif  [ -d $filename ];  then
     echo  "Directory."
else 
     echo  "Other type."
fi


示例二:添加10个用户,user1 ,,....user10,密码同用户名(只有root能改密码)。

**只有root能修改密码**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
1、列表,直接给出
#!/bin/bash
# Version: 0.0.2
# Author: Lcc.org
# Description: add user
 
##避免执行命令的用户非root用户,非root用户是不能修改密码的。
if  [ $UID - ne  0 ];  then
   echo  "Only root."
   exit  1
fi
 
##以给出列表的方式,循环。当列表循环完毕时,循环结束
for  in  user1 user2 user3 user4 user5 user6 user7 user8 user9 user10;  do
 
   ## 判断用户是否存在。
   if  id  $i &>  /dev/null then
     ## 执行状态结果为0时,条件为真时,说明什么呢?
     echo  "$i exist"
   else
         ## 用户不存在时,即可添加用户
     if  useradd  $i 2>  /dev/null then
       ## 添加不成功时, 组合中,对命令或测试条件取反。
       echo  "$i is outside the law"
     else
       ## 用户名,正常,能正常添加用户,则可以给其添加密码
           echo  "$i"  passwd  --stdin $i >  /dev/null  2>&1
           ## 数值测试添加密码的执行状态结果。
       if  [ $? - ne  0 ];  then
         ## 结果不为0,表示执行不成功
         echo  "password is not legal"
       fi
     fi
   fi
done
 
2、{1..10}
#!/bin/bash
# Version: 0.0.3
# Author: Lcc.org
# Description: {}表示列表
 
[ ! $UID - eq  0 ] &&  echo  "Only root."   &&  exit  1
 
for  in  {1..10}
do
   id  user$i &>  /dev/null
   if  [ $? - eq  0 ];  then
     echo  "user$i exist"
   else
     useradd  user$i 2>  /dev/null
     [ $? - ne  0 ] &&  echo  "UserName is not legal"  &&  continue
     echo  "user${i}"  passwd  --stdin user${i} &>  /dev/null
     [ $? - ne  0 ] &&  echo  "Password is not legal"
     echo  "Add user user$i finished"
   fi
done
3、命令引用
#!/bin/bash
# Version: 0.0.4
# Author: Lcc.org
# Description:  $(seq 10)表示列表
 
[ ! $UID - eq  0 ] &&  echo  "Only root."   &&  exit  1
 
for  in  $( seq  10)
do
   id  user$i &>  /dev/null
   if  [ $? - eq  0 ];  then
     echo  "user$i exist"
   else
     useradd  user$i 2>  /dev/null
     [ $? - ne  0 ] &&  echo  "UserName is not legal"  &&  continue
     echo  "user${i}"  passwd  --stdin user${i} &>  /dev/null
     [ $? - ne  0 ] &&  echo  "Password is not legal"
     echo  "Add user user$i finished"
   fi
done
4、特殊变量
#!/bin/bash
# Version: 0.0.5
# Author: Lcc.org
# Description: $*,$@表示列表
 
[ ! $UID - eq  0 ] &&  echo  "Only root."   &&  exit  1
 
for  in  $*
do
   id  $i &>  /dev/null
   if  [ $? - eq  0 ];  then
     echo  "$i exist"
   else
     useradd  $i 2>  /dev/null
     [ $? - ne  0 ] &&  echo  "UserName is not legal"  &&  continue
     echo  "${i}"  passwd  --stdin ${i} &>  /dev/null
     [ $? - ne  0 ] &&  echo  "Password is not legal"
     echo  "Add user $i finished"
   fi
done



示例三:判断/var/目录下每个文件的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
方法一
#!/bin/bash
# Version: 0.0.6
# Author: Lcc.org
# Description: file type
 
for  in  /var/ *;  do
   if  [ -f $i ];  then
       echo  "Common file."
   elif  [ -L $i ];  then
       echo  "Symbolic file."
   elif  [ -d $i ];  then
       echo  "Directory."
   else
     echo  "Other type"
   fi
done
 
方法二:
#!/bin/bash
# Version: 0.0.7
# Author: Lcc.org
# Description: Galaxy 
 
cd  /var
for  in  $( ls  /var );  do
   if  [ -f $i ];  then
     echo  "Common file."
   elif  [ -L $i ];  then
     echo  "Symbolic file."
   elif  [ -d $i ];  then
     echo  "Directory."
   else
     echo  "Other type"
   fi
done
 
方法三:
#!/bin/bash
# Version: 0.0.8
# Author: Lcc.org
# Description: Add DIR
 
for  in  $( ls  /var );  do
     if  [ -f  /var/ $i ];  then
         echo  "Common file"
     elif  [ -L  /var/ $i ];  then
         echo  "Symbolic file"
     elif  [ -d  /var/ $i ];  then
         echo  "Directory"
     else
         echo  "Other type"
     fi
done


示例四:tcp协议下处于ESTABLISH状态的有多少个,LiSTEN有多少个,有几种状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
方法一:
#!/bin/bash
# Version: 0.0.9
# Author: Lcc.org
# Description: statusTCP
 
declare  -i listen=0
declare  -i established=0
declare  -i other=0
 
for  in  $( netstat  -tan |  grep  '^tcp\>'  tr  -s  ' '  cut  -d ' '  -f6);  do
     if  "$i"  ==  "LISTEN"  ];  then
         let  listen++
     elif  "$i"  ==  "ESTABLISHED"  ];  then
         let  established++
     else
         let  other++
     fi
done
 
echo  -e  "LISTEN statu: $listen\nESTABLISHED statu: $established\nOther status: $other\nTotal type: $(netstat -tan | grep '^tcp\>' | tr -s ' ' | cut -d' ' -f6 | sort -u | wc -l)"
方法二:
# netstat -tan | grep '^tcp\>' | awk -v FS=' ' '{ARRAY[$NF]++}END{for(i in ARRAY){print i,ARRAY[i]}}'
LISTEN 12
CLOSE_WAIT 1
ESTABLISHED 3









本文转自 lccnx 51CTO博客,原文链接:http://blog.51cto.com/sonlich/1955978,如需转载请自行联系原作者
目录
相关文章
|
5天前
|
安全 算法 Ubuntu
Linux(openssl)环境:编程控制让证书自签的技巧。
总结:在Linux环境中,OpenSSL是一个非常实用的工具,可以帮助我们轻松地生成自签名证书。通过上述三个简单步骤,即可为内部网络、测试环境或开发环境创建自签名证书。但在公共访问场景下,建议购买经过权威认证机构签发的证书,以避免安全警告。
38 13
|
1月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
99 25
|
1月前
|
安全 Linux
阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip
公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
170 28
|
2月前
|
JavaScript Ubuntu Linux
如何在阿里云的linux上搭建Node.js编程环境?
本指南介绍如何在阿里云Linux服务器(Ubuntu/CentOS)上搭建Node.js环境,包含两种安装方式:包管理器快速安装和NVM多版本管理。同时覆盖全局npm工具配置、应用部署示例(如Express服务)、PM2持久化运行、阿里云安全组设置及外部访问验证等步骤,助你完成开发与生产环境的搭建。
|
3月前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
193 32
|
3月前
|
存储 Linux 网络安全
linux应急响应检查脚本
通过这个脚本,可以快速收集系统的关键信息,有助于在发生问题时进行及时的应急响应和分析。
164 34
|
3月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
81 17
|
3月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
78 26
|
5月前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
1114 1
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
5月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
215 13