标签:linux编程
bash:过程式编程,为了完成更复杂的任务,支持顺序执行、选择执行、循环执行
顺序执行:从左而右,依次执行命令。
选择执行:依据condition(条件)的执行状态结果,选择执行不同的代码片段。
循环执行:依据condition(条件)的执行状态结果,决定是否进入循环。
condition:
ture: 表示条件状态结果为0
false: 表示条件执行状态结果非0
if
单分支、双分支、多分支、嵌套if语句
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、格式一 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、变量引用。 $* 向脚本传递的所有参数,整体。$@向脚本传递的所有参数,每个独立
脚本格式
#!/bin/bash # Version: major.minor.release # Author: # Desc:
脚本语法检测
# bash -n file.sh
调试脚本
# bash -x file.sh
记录脚本退出状态码
INTEVAL=$? (变量引用实现赋值)
用户邮箱位置
/var/mail
定义变量的类型
整型: # declare -i var
定义环境变量
# env var # declare -x var # export var
定义只读变量
# declare -r var # readonly var
显示本地和环境变量
# set
显示环境变量
# export # env # printenv
显示只读变量
# readonly -p
示例一:交互式给出一个文件路径,判断文件的类型
#!/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、列表,直接给出 #!/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 i 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 i 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 i 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 i 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/目录下每个文件的类型
方法一 #!/bin/bash # Version: 0.0.6 # Author: Lcc.org # Description: file type for i 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 i 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 i 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有多少个,有几种状态
方法一: #!/bin/bash # Version: 0.0.9 # Author: Lcc.org # Description: statusTCP declare -i listen=0 declare -i established=0 declare -i other=0 for i 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
本文出自 “Reading” 博客,请务必保留此出处http://sonlich.blog.51cto.com/12825953/1955978
谢烟客---------Linux之bash脚本编程---if补充和for循环
标签:linux编程
原文地址:http://sonlich.blog.51cto.com/12825953/1955978