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,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
22天前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
29天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
98 13
|
2月前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
2月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
3月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
102 1
|
4月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
4月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
870 2
|
4月前
|
Linux Shell
Linux系统编程:掌握popen函数的使用
记得在使用完 `popen`打开的流后,总是使用 `pclose`来正确关闭它,并回收资源。这种做法符合良好的编程习惯,有助于保持程序的健壮性和稳定性。
195 6
|
3月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
46 0