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,如需转载请自行联系原作者
目录
相关文章
|
16天前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
27 1
|
6天前
|
监控 Shell Linux
Linux的Shell脚本详解
Linux的Shell脚本详解
|
12天前
|
算法 Linux 测试技术
Linux编程:测试-高效内存复制与随机数生成的性能
该文探讨了软件工程中的性能优化,重点关注内存复制和随机数生成。文章通过测试指出,`g_memmove`在内存复制中表现出显著优势,比简单for循环快约32倍。在随机数生成方面,`GRand`库在1000万次循环中的效率超过传统`rand()`。文中提供了测试代码和Makefile,建议在性能关键场景中使用`memcpy`、`g_memmove`以及高效的随机数生成库。
|
18天前
|
Ubuntu Java Linux
Linux centos7 ubuntu 一键安装Java JDK 脚本 shell 脚本
Linux centos7 ubuntu 一键安装Java JDK 脚本 shell 脚本
|
18天前
|
Ubuntu 应用服务中间件 Linux
Linux Centos7 ubuntu 安装nginx,脚本一键安装nginx
Linux Centos7 ubuntu 安装nginx,脚本一键安装nginx
|
18天前
|
Shell Linux
shell linux中shell脚本编写俄罗斯方块
shell linux中shell脚本编写俄罗斯方块
|
10天前
|
Linux
Linux 系统日常巡检脚本 干货
Linux 系统日常巡检脚本 干货
8 0
|
11天前
|
Linux Shell 测试技术
Linux服务器测试脚本集合
LemonBench是iLemonrain创作的Linux服务器性能测试工具,能一键检测系统信息、网络、CPU、内存和硬盘性能。
10 0
|
17天前
|
Linux Shell 开发者
深入了解 Linux 命令 `autoscan`:为自动配置脚本做准备
`autoscan` 是 Linux 和 Unix-like 系统中用于软件配置的工具,它扫描源代码并生成 `configure.scan` 文件,为 `autoconf` 创建初始模板。开发者通常将 `configure.scan` 重命名为 `configure.ac` 并进行编辑,然后用 `autoconf` 转换为可执行的 `configure` 脚本。在使用前,记得备份项目,确保权限,并安装 `autoconf`。`configure` 脚本能适应多种系统,检查环境并生成 `Makefile`。
|
18天前
|
Ubuntu Shell Linux
linux shell 后台执行脚本的方法 脚本后台运行 后台运行程
linux shell 后台执行脚本的方法 脚本后台运行 后台运行程