6.3 bash编程 字符测试

简介:

给定一个用户,判断其UID和GID是否一样 "^$USERNAME\>"(行首第一个单词)

如果一样,就显示此用户为"good guy";否则,就显示此用户为"bad guy"

#!/bin/bash

#

USERNAME =user1

if !grep "^$USERNAME\>" /etc/passwd &> /dev/null;then 用户不存在

  echo "No such user: $USERNAME."

  exit 1

fi


USERID = `id -u $USERNAME`

GROUPID =`id -g $USERNAME`

if[ $USERID -eq $GROUPID ];then

  echo "good guy"

else

  echo "bad guy"

fi

exit: 退出脚本

exit #(#代表数字)


bash中常用的条件测试三种

   -gt

   -le

   -ne

   -ge

   -lt 

   -eq               非0值都是假

 --------------------只有上面才能用[],其他表达式中不能出现[]

INT1 = 63

INT2 = 77

[ $INT1 -eq $INT2 ]

[[ $INT1 -eq $INT2 ]]

TEST $INT1 -eq $INT2


if [ `grep "^$USENAME\>" /etc/passwd | cut -d: -f3` -eq 0 ];then 对

if [ `grep "^$USENAME\>" /etc/passwd ` -eq 0 ];then 错(前面是一行)

测试方法

[ expression ]  bash的命令

` expression ` bash关键字  

test expression


文件测试:

-e FILE:测试一个文件是否存在

-f FILE:测试文件是否为普通文件

-d FILE: 测试指定路径是否为目录的

-r FILE: 测试当前用户对指定文件是否有读取权限

-w

-x FILE


[ -e /etc/initttab ]

[ -x /etc/rc.d/rc.sysinit ]


练习:写一个脚本

给定一个文件,比如/etc/inittab

判断这个文件中是否有空白行

如果有,则显示其空白行数,否则,显示没有空白行

#!/bin/bash

FILE = /etc/inittab

if [! -e $FILE ];then

  echo "No $FILE."

  exit 8

fi


if grep "^$" $FILE &> /dev/null;then

  echo "Total blank lines: `grep "^$" $FILE | wc -l`."

else 

  echo "No blank line."

fi


圆整,丢弃小数点后的内容

expr命令一般用于整数值

#expr argument operator argument


练习:编写一个脚本

给定一个用户,获取其密码警告期限:

而后判断用户最近一次修改密码时间距今天是否已经小于警告期限

   提示:算术运算的方法$[$A-$B]:表示变量A的值减去变量B的值的结果

如果小于,则显示"Warning":否则,就显示"OK"

#!/bin/bash

#

W=`grep "student" /etc/shadow | cut -d: -f6`

S=`date +%s`

T=`expr $S/86400`

L=`grep "^student" /etc/shadow | cut -d: -f5`

N=`grep "^student" /etc/shadow | cut -d: -f3`

SY=$[$L-$[$T-$N]]


if [ $SY -lt $W ];then

  echo 'Worning'

else

  echo 'OK'

fi


练习:写一个脚本

判读命令历史中历史命令的总条目是否大于1000;如果大于,则显示

   "Some command will gone.";否则显示"ok"

history 当前显示缓冲区中的条数(会大于1000)

$HISTSIZE  都只显示1000

$HISTFILESIZE  都只显示1000

history | tail -l | cut -d' ' -f1 由于前面有一个空格,取不出条数,当取第二个字段

history | tail -l | cut -d' ' -f2

#!/bin/bash

#

COUNT = history | tail -l | cut -d' ' -f2

if $COUNT -gt 1000 ;then

  echo "Some command will gone."

else

  echo "ok"

fi


多分支的if语句

if 判断条件1;then

   statement1

   ...

elif  判断条件2;then

   statement2

   ...

elif  判断条件3;then

   statement3

   ...

else 判断条件4;then

   statement4

   ...

fi

   

#!/bin/bash

#

FILE =/etc/inittab


if [ -e $FILE ];then

  echo "OK"

else

  echo "No such file"

fi


测试脚本是否有语法错误

bash -n filetest.sh 


bash -x 脚本:单步执行


给定一个文件,如果是一个普通文件,就显示之

如果是一个目录,亦显示之

否则,此为无法识别之文件

filetest2.sh

#!/bin/bash

#

FILE = /etc/rc.d/rc.sysinit


if [ ! -e $FILE ];then

  echo "NO such file"

  exit 6

fi


if [ -f $FILE ];then

  echo "Common file"

elif [ -d $FILE ];then

  echo "Directory"

else

  echo "Unkown."

fi


定义脚本退出状态码

如果脚本没有明确定义退出状态码,那么,最后执行的一条命令

    的退出码即为脚本的退出状态码


bash变量的类型:

  本地变量(局部变量) 当前shell进程

  环境变量 当前shell进程及其子进程


  位置变量:$1 $2 ...

            shift(踢掉一个位置值)默认踢1个

            shift [n]踢掉n个

  特殊变量 $?

           $#:参数的个数

           $*:参数列表

           $@:参数列表


./filetest.sh /etc/fstab /etc/inittab

$1:/etc/fstab

$2:/etc/inittab


练习:写一个脚本

能接受一个参数(文件路径)

判定:此参数如果是一个存在的文件,就显示OK ,否则显示No such file

#!/bin/bash

#

echo $#

echo $*

echo $@

if[ $# -lt 1 ];then

  echo "Usage: ./filetest3.sh ARG1 [ARG2 ...]"

if [ -e $1 ];then

  echo "ok"

else

  echo "No such file"

fi


练习:写一个脚本

给脚本传递两个参数(整数)

显示此两个参数之和,之乘积

#!/bin/bash

#

if [ $# -lt 2 ];then

   echo "Usage: cac1.sh ARG1 ARG2"

   exit

fi

echo "The sum is : $[$1 + $2]."

echo "The prod is : $[$1 * $2]."



sed -n 静默

    -i 直接修改原文件

    -e SCRIPT -e SCRIPT:可以同时执行多个脚本

    -f /PATH/TO/SED_SCRIPT

        sed -f /path/to/scripts file

                这个文件是脚本一行一个脚本运用在file上

    -r :表示使用扩展正则表达式

删除行首的空格

history | sed 's#^[[:space:]]*##g'

history | sed 's#^[[:space:]]+##g'

g:全局替换

i:忽略字符大小写


s///:s###,s@@@

sed 's#l..e#&r#g' sed.txt

sed 's#\(l..e\)#\1r#g' sed.txt 后项引用


like - Like 

love - Love

sed 's#l\(..e\)#L\1#g' sed.txt

&:引用模式匹配到的整个串


sed练习:

1 删除/etc/grub.conf文件中行首的空白符

  sed -r 's@^[[:space:]]+@@g' /etc/grub.conf


2 替换/etc/inittab文件中"id:3:initdefault:"一行

  中的数字为5

  sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab


3 删除/etc/inittab文件中的空白行

  sed '/^$/d' /etc/inittab


4 删除/etc/inittab文件中开头的#号

  sed 's@^#@@g' /etc/inittab


5 删除/etc/inittab文件中开头的#号及后面的空白字符,但要求

  #号后面必须有空白字符

  sed -r 's@^#[[:space:]]+@@g' /etc/inittab


6 删除某文件中以空白字符后面跟#类的行中的开头的

  空白字符及#

  sed -r 's@^[[:space:]]+@@g' /inittab

 

7 取出一个文件路径的目录名称

  echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g' 取etc

基名:

  echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g' 取rc.d


#abc

# hello world

   # hi world


练习:

传递一个用户名参数给脚本,判断此用户名跟其基本组的

   组名是否一致,并将结果显示出来

[  ]条件是

vi testUser.sh

#!/bin/bash

#

if !id $1 &>/dev/null;then

  echo "No such user."

  exit 8

fi


#if [ `id -n -u $1` == `id -n -g $1`];then

if [ $1 == `id -n -g $1`];then  用户名本来就是一个字符串

  echo "yiyang"

else

  echo "buyiyang"

fi


字符测试:

== [ $A = $B ]

!= [ $A != $B ]

>

<

-n string:测试指定字符串是否为空,空真

-z string:测试指定字符串是否不空,不空真


练习:写一个脚本

传递一个参数(单字符就行)给脚本,如果参数为q,就退出脚本;

   否则,就显示用户的参数


练习:写一个脚本

传递一个参数(单字符就行)给脚本,如果参数为q、Q、Quit,就退出脚本;

   否则,就显示用户的参数

#!/bin/bash

#

if [ $1 = 'q' ];then

  echo "Quiting..."

  exit 1

elif [ $1 = 'Q' ];then

  echo "Quiting..."

  exit 2

elif [ $1 = 'quit' ];then

  echo "Quiting..."

  exit 3

elif [ $1 = 'Quit' ];then

  echo "Quiting..."

  exit 4

else

  echo $1

fi


练习:

传递三个参数给脚本,第一个为整数;第二个为算术运算符,

第三个为整数,将计算结果显示出来,要求保留两位精度,

形如:

./calc.sh 5 /2


echo "scale=2;111/22;" | bc  答案5.02

bc <<< "scale=2;111/22;"


练习:

传递3个参数给脚本,参数均为用户名,将此些用户的账号信息取

    出来后放置于/tmp/testusers.txt文件中,并要求每一行行首

    有行号

添加行号

echo "1 $LINE" >> /tmp/testusers

echo "2 $LINE" >> /tmp/testusers


练习:

 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id

 一行中,如果其生产商为AuthenticAMD,就显示其为AMD公司;如果生

 产商为GenuineIntel,就显示其为Intel公司:否则,就说其为非主流

 公司:


写一个脚本:

给脚本传递三个参数,判断其中的最大数和最小数,并显示出来

MAX=0

 -eq -lt




写一个脚本:

1 设定变量FILE的值为/etc/passwd

2 依次向/etc/passwd中的每个用户问好,并显示对方的shell,形如:

  Hello,root,your shell:/bin/bash

3 统计一共有多少用户

  LINES = `wc -l /etc/passwd | cut -d' ' -f1`

  for I in `seq 1 $LINES`;do 

    echo "hello, `head -n $I /etc/passwd | tail -1 | cut -d: -f1`"

只向默认shell为bash的用户问声好


写一个脚本:

1 添加10个用户user1到user10,但要求只有用户不存在的情况下才能

  添加,密码同用户名


扩展:

接收一个参数

add:添加用户user1..user10

del:删除用户user1..user10

其他,退出

adminusers --add user1,user2,user3,hello,hi


vim adminuser2.sh

#/bin/bash

#

#echo $1

#echo $1 | tr -d','删除所有的逗号

#echo $1 |sed 's/,/ /g'

for I in `echo $1 |sed 's/,/ /g'`;do

  if id $I &> /dev/null;then

    echo "$I exist."

  else

    useradd $I

    echo $I | passwd --stdin $I &> /dev/null

    echo "add $I finished."

  fi

done


vim adminuser3.sh

#/bin/bash

#

if [ $1 == '--add' ];then

  for I in `echo $2 |sed 's/,/ /g'`;do

    if id $I &> /dev/null;then

      echo "$I exist."

    else

      useradd $I

      echo $I | passwd --stdin $I &> /dev/null

      echo "add $I finished."

    fi

  done

elif [ $1 == '--del' ];then

  for I in `echo $2 |sed 's/,/ /g'`;do

    if id $I &>/dev/null;then

       userdel -r $I

       echo "Delete $I finished."

    else 

       echo "$I not exist."

    fi

  done

elif [ $1 == '--help' ]

  echo "Usage:adminuser2.sh --add USER1,USER2,... | --del USER1,USER2,... --help"

else

  echo "Unkown ARG"

  exit 8

fi


在剩下的三个月里,你愿意与学习结为伴侣,无论贫穷还是富贵,

   无论电脑还是手机,无论多困或者多累,无论想吃还是想睡,

   都要把学习放在第一位,以不落后为目标,同甘共苦同舟共济

   永不言弃,爱惜她,尊重她,理解她,保护她,你愿意这样做吗

vim adduser.sh

#!/bin/bash

#


for I in {1..10};do

  if id user$I &>/dev/null;then

     echo "user$I exist."

  else 

     useradd user$I

     echo user$I | passwd --stdin user$I &>/dev/null

     echo "ADD user user$I finished"

  fi

done


vim deluser.sh

#!/bin/bash

#


for I in {1..10};do

  if id user$I &>/dev/null;then

     userdel -r user$I

     echo "Delete user$I finished."

  else 

     echo "user$I not exist."

  fi

done


vi adminnusers.sh

#/bin/bash

#

if [ $# -lt 1 ];then

  echo "Usage:adminnusers ARG"

  exit 7

fi


if [ $1 == '--add' ];then

  for I in {1..10};do

    if id user$I &> /dev/null

       echo "user$I exist."

    else 

     useradd user$I

     echo user$I | passwd --stdin user$I &>/dev/null

     echo  "ADD user user$I finished"

    fi

  done

elif [ $1 == '--del' ];then

  for I in {1..10};do

    if id user$I &>/dev/null;then

       userdel -r user$I

       echo "Delete user$I finished."

    else 

       echo "user$I not exist."

    fi

  done

else

  echo "Unkown ARG"

  exit 8

fi


循环:进入条件,退出条件

for

while

until

for 变量 in 列表;do

  循环体

done

for i in 1 2 3 4 5;do

  加法运算

done


遍历完成之后,退出:


如何生成列表:

  {1..100}

   seq [起始数 [步进长度]] 结束数

   `ls /etc`也能访问每一个文件的列表

默认变量是字符串

declare -i SUM=0

       integer

        -x (环境变量)

1,...100

#/bin/bash

#

#let SUM = 0  此时变量是数字let

declare -i SUM=0


for I in {1..100};do

  let SUM =$[$SUM+$I]

done


echo "The sum is $SUM."


写一个脚本

计算100以内所有能被3整除的整数的和

取模,取余%


写一个脚本:

计算100以内所有奇数和以及所有偶数的和:分别显示之:


写一个脚本,分别显示当前系统上所有默认shell为bash的用户和默认

  shell为/bin/nologin的用户,并统计各类shell下的用户总数,显示

  结果形如:

BASH,3users,they are:

root,redhat,gentoo


NOLOGIN,2users,they are:

bin,ftp















本文转自飞行萌51CTO博客,原文链接:http://blog.51cto.com/8527508/1941827 ,如需转载请自行联系原作者


相关文章
|
2月前
|
Python
numpy | 插入不定长字符数组测试OK
本文介绍了如何在numpy中创建和操作不定长字符数组,包括插入和截断操作的测试。
|
6月前
|
存储 测试技术
LabVIEW编程开发PCB自动测试设备
LabVIEW编程开发PCB自动测试设备
52 1
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
46 2
|
1月前
|
安全 网络安全 数据安全/隐私保护
Python渗透测试之流量分析:流量嗅探工具编程
Python渗透测试之流量分析:流量嗅探工具编程
|
3月前
|
IDE Java 测试技术
揭秘Java高效编程:测试与调试实战策略,让你代码质量飞跃,职场竞争力飙升!
【8月更文挑战第30天】在软件开发中,测试与调试对确保代码质量至关重要。本文通过对比单元测试、集成测试、调试技巧及静态代码分析,探讨了多种实用的Java测试与调试策略。JUnit和Mockito分别用于单元测试与集成测试,有助于提前发现错误并提高代码可维护性;Eclipse和IntelliJ IDEA内置调试器则能快速定位问题;Checkstyle和PMD等工具则通过静态代码分析发现潜在问题。综合运用这些策略,可显著提升代码质量,为项目成功打下坚实基础。
62 2
|
3月前
|
存储 测试技术 数据库
Python接口自动化测试框架(练习篇)-- 函数编程(一)
本文通过实际的编程练习,讲解了面向过程编程的概念和应用,包括如何定义函数、处理文件读写以及实现用户注册功能,最终将这些过程封装成函数,体现了Python作为脚本语言的面向过程编程特性。
28 2
|
3月前
|
测试技术 Python
Python接口自动化测试框架(练习篇)-- 函数编程(二)
本文通过具体的编程练习,深入探讨了Python中的函数编程,包括如何定义函数、使用参数和返回值,以及函数式编程的技巧和应用,如使用lambda表达式和递归函数解决实际问题。
29 1
|
4月前
|
Java 数据库 Spring
Java编程问题之在测试中使用CGLIB创建代理类如何解决
Java编程问题之在测试中使用CGLIB创建代理类如何解决
|
5月前
|
算法 Linux 测试技术
Linux编程:测试-高效内存复制与随机数生成的性能
该文探讨了软件工程中的性能优化,重点关注内存复制和随机数生成。文章通过测试指出,`g_memmove`在内存复制中表现出显著优势,比简单for循环快约32倍。在随机数生成方面,`GRand`库在1000万次循环中的效率超过传统`rand()`。文中提供了测试代码和Makefile,建议在性能关键场景中使用`memcpy`、`g_memmove`以及高效的随机数生成库。
|
6月前
|
设计模式 并行计算 算法
代码之韵:高效编程的艺术深入理解软件自动化测试框架的设计与实现
【5月更文挑战第29天】在数字世界的构建中,编程不仅仅是一门科学,更是一种艺术。本文将探讨如何通过理解编程的本质、掌握设计模式、运用算法智慧以及持续的性能优化过程,来提升编程效率和代码质量。我们将从宏观的架构设计到微观的代码细节,剖析那些让代码更加优雅、高效且易于维护的技巧与实践。
下一篇
无影云桌面