read,locate ,find 的总结及相关联系

read 变量名

read 变量名1 [变量名2] < 文件名
不支持管道
read 变量名1 [变量名2] <<< “值1 [值2] …”
使用read来把输入值分配给一个或者多个shell变量
     -p 指定要显示的提示     # read -p “please inout your passwd :” passwd1
     -s 静默输入,一般用于密码  # read -sp “please inout your passwd:” passwd1 加echo可以换行
     -n  N指定输入的字符长度N  # read -n 5 name  # read -n 5 -p “hello: ” name
     -d ‘字符’输入结束符 # read -d . -p “hello: ” name(敲点结束.)
     -t N TIMEOUT为N秒 # read -t 3 -p “hello: ” name (过3秒后自动结束)

防止扩展
      反斜线\会使随后的字符按原意解释,也就是转意
      $ echo your cost : \$5.00
      your cost :$5.00
加单引号防止扩展
      单引号’防止所有扩展
      双引号“”也防止所有扩展,但是以下情况列外:
      $ `(反引号)\反斜杠 !这四个不可以用” ” 双引号
       

交互式登录(登录shell)
使用终端通过用户名密码登录、su – username
执行顺序:/etc/profile –> /etc/profile.d/.sh –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc
非交互登录 (非登录shell)
su username 、图形界面下打开终端、执行脚本、其他bash实例
执行顺序: ~/.bashrc –> /etc/bashrc –> /etc/profile.d/
.sh 

locate  查询系统上预建的文件索引数据库 /var/lib/mlocate.db 
        依赖于事先构建的索引 
          索引的构建是在系统较为空闲时自动进行的(周期任务),管理员手动更新数据库(updatedb)
索引构建过程需要遍历整个根文件系统,及消耗资源
        工作特点:
                 查找速度快
                 模糊查找
                 非实时查找
                 搜索的是文件的全路径,不仅仅是文件名
                 可能只是搜索用户具备读取和执行权限的目录

        -i 不区分大小写   # locate  -i f1 |grep app
-n X  只列举前n个匹配项目  # locate  -i -n 1 f1 |grep app
updatedb 更新locate数据库 /var/lib/mlocate/mlocate.db
-r 支持正则  使用regex来搜索以.conf 结尾的文件 (’.conf$’)
           # locate  -r ‘f1$’   # locate  -r ‘.sh$’

find   实时查找工具,通过遍历指定路径完成文件查找
       工作特点:
                查找速度稍慢
                精确查找
                实时查找
                可能只搜索用户具备读取和执行权限的目录 

-maxdepth level 最大搜索深度 指定目录为第一级 # find -maxdepth 12 -name f1
-minxdepth level  最小搜索深度 # find -mindepth 12 -name f1  # find -mindepth 12 -maxdepth 12 -name f1
-name 基于名称的精确查找  
               “文件名称” 支持文件通配符 glob 
            *, ?,[],[^ ]  # find -name f1  # find -name “f1”  # find -name “[ab]f
         # find -name “[a-z]f
”  # find -name “[a-z]f[0-9]”   # find -name “[a-z]f[[:digit:]]” 
        -iname 基于名称忽略大小写的精确查找查找  # find -iname f1
-inum 基于inode查找 # ls -li  # find -inum 78  # find -inum 78 ls
-samefile 基于相同inode号的查找(查找硬链接)
              # ln f1 f10  # ls -li f1 f10  # find -samefile f1

-links n 硬链接为n的文件  # find -links 2
-regex 支持正则 默认为(emacs标准)  # find -regex “..sh$”  # find -regex “.\/[0-9].”  不支持 [[:upper:]]
-regextype egrep -regex 支持egrep同标准的正则   # find -regextype egrep -regex “.
\/[[:upper:]].” 
-user 用户名  基于文件owner的查找   #chown guanyu f1  #find  -user guanyu ls
-group 组名 基于文件group的查找     # chgrp liubei f1  #find  -group liubei ls 
-uid userid 基于文件uid的查找       #find -uid number -ls
-gid groupid 基于文件gid的查找      #find -gid number -ls
-nouser 查找没有owner的文件         userdel -r username ls -l  #find -nouser -ls
  -nogroup 查找没有group的文件        #find -nogroup -ls
-type 基于文件类型的查找
f: 普通文件  #find -type f
d: 目录文件  #find -type d
l: 符号链接文件 #find -type l
s:套接字文件 
b: 块设备文件 
c: 字符设备文件 
p: 管道文件
      组合条件查找:
                与:-a             find -nouesr -a -nogroup
                或:-o             find -nouesr -o -nogroup
                非:-not, !        find ! -nouesr  或 find -not -nouesr 
      德.摩根定律:
               (非A) 或(非B)= 非(A且B)
               (非A)且(非B) = 非(A或B)
                如:
                !A -a !B = !(A -o B)
                !A -o !B = !(A -a B)              
       find / -name “
.txt ” 当前目录下
       find /var -name “log” 指定/var目录下
       find  -uesr joe -group joe 搜索被用户joe以及组群joe所拥有的文件     

  查找/etc下,  除了/etc/sane.d目录的其它所有.conf 后缀的文件   
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “.conf” -path 指定目录 -prune 删除,排除
  find /etc ( -path ‘/etc/sane.d’ -o -path ‘/etc/fonts’ ) -a -prune -o -name “
.conf”

根据文件大小来查找
        -size [+|-]#UNIT    
      常用单位:k, M, G,c(byte)

UNIT:  (#-1, #]如:6k 表示(5k,6k] ( 大于       ] 小于 #find -size 20M 大于19 小于等于20

       -#UNIT:[0,#-1]如:-6k 表示[0,5k]   [ 大于等于   ] 小于等于 // #find -size  -20M 大于等于0小于等于19
+#UNIT:(#,∞)如:+6k 表示(6k,∞)   #find -size  -20M  大于20到无穷
 
dd if=/dev/zero of=small.img bs=1M count=10  创建一个10M的文件

dd if=/dev/zero of=middle.img bs=1k count=20 创建一个20M的文件

dd if=/dev/zero of=big.img bs=1k    count=30 创建一个30M的文件

dd if=/root/centos7.3.iso of=/dev/sr0 将iso刻入光盘
dd if=/dev/sr0 of=/root/cntos7.3.iso  将光驱导入iso文件

练习:
1.编写脚本/bin/per.sh,判断当前用户对指定的参数文件,是否不可读并且不可写
[ ! -r $1 -a ! -w $1 ] && echo “can’t read and write”
[ ! ( -r $1 -o -w $1 ) ] && echo “can’t read and write”
        [ ! -r $1 -a ! -w $1 ] && echo 文件不可读也不可写 || echo 文件可读也可写

2.编写脚本/root/bin/excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
filename=basename $1
([ -f $1 ] && [[ “$filename” =~ .*.sh$ ]]) && chmod u+x $1 ||echo “非用户脚本文件”
unset filename

        ([[ $1 =~ “.sh”$ ]] && [ -f $1 ])  &&  chmod +x $1 || echo 非脚本文件

3.编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统
nologin:[ “$1” ] && (id $1 &> /dev/null && passwd -l $1 > /dev/null && echo “用户$1 禁用成功!” 
        || echo “用户$1 不存在!”) \  
         || echo “请在命令后面输入指定的用户!”
        login:[ “$1” ] && (id $1 &> /dev/null && passwd -u $1 > /dev/null && echo “用户$1 解锁成功!” 
        || echo “用户$1 不存在!”) \  
             ||  echo “请在命令后面输入指定的用户!”

        #!/bin/bash 
        usermod -s /bin/bash $1
        #!/bin/bash
        usermod -s /sbin/nologin $1

作业:
编写一个脚本/root/bin/createuser.sh,脚本的执行语法必须是:createuser.sh -u username -m password,选项与参数间可支持多空格,但不能顺序颠倒。 
当未指定正确的选项或参数时,以错误输出方式提示“createuser.sh -u username -m password ”后退出脚本。
用户名必须以字母开头,可包括数字和_。否则不合法。以错误输出提示用户”用户名仅包含字母数据和下划线”
当用户名检测合法后,判断用户名是否已存在,若存在,再判断用户是否已设置过密码,若设置过密码,直接退出,未设置,则将密码设置为所指定的密码后以正确输出方式显示“username 密码已更新后退出”
当用户名不存在,则创建用户,并为该用户设置所指定的密码后以正确输出方式显示“用户username已创建并更新密码”
要求脚本执行过程中不能有非要求的其他输出结果出现。脚本在非正确方式退出时应反回给?参数非0值。

!/bin/bash

——————————————

Filename:

Author:whb

Email:

Website:

Description:

——————————————

[ $@ ] ||(echo 请输入参数;exit 1) ||exit 1 &&echo $1

echo false

[ $1 = “-u” -a $3 = “-m” -a $# -eq 4 ] &>/dev/null ||(echo createuser.sh -u username -m password 1>&2 && exit 
1
                )&&(
        echo $2 |egrep “\<^[:alpha:]*$\>” &>/dev/null ||(echo 用户名仅包含字母数>
据和下划线 1>&2 ;exit 1
                        ) &&(
                id $2 &amp;&gt;/dev/null ||(useradd $2 ;echo $4 |passwd –stdin $2 &>/dev/null &&echo 用户${2}已>
创建并更新密码;exit 1 
                                ) &&(getent shadow $2 |egrep ‘\$'[[:digit:]]’\$’ &>/dev/null &&(echo 密码已存>
在 1>&2 ;exit 0
                                                )||(
                                echo $4 |passwd –stdin $2 &>/dev/null &&echo 用户${2}密码已更新;exit 1
                                )||exit 1)||exit 1)||exit 1) ||exit 1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@答案2

!/bin/bash

———————–

Filename:createuser13.sh

Revision:7.0

Date:2017-08-06

Description:create user

———————–

判断用户名是否规范,并且给出返回值

decide=(echo $2|grep "^[[:alpha:]]\([[:alpha:]]\|[[:digit:]]\|_\)*$" &amp;&gt;/dev/null;echo $?)

判断用户是否存在,并给出返回值

id=id $2 &amp;&gt;/dev/null;echo $?

截取用户密码位

mima=getent &nbsp;shadow $2 |cut -d: -f 2

判断第一个参数

if [ “$1” != “-u” ];then
   echo “createuser.sh -u username -m password”
   exit 1
fi

判断第三个参数 

if [ “$3” != “-m” ];then
   echo “createuser.sh -u username -m password”
   exit 1
fi

判断参数个数

if [ $# -ne 4 ];then
   echo ” createuser.sh -u username -m password”
   exit 1
fi

判断第二个参数

if  [ $decide -ne 0 ];then
    echo “用户仅包含字母数字和下划线”
    exit 1
else
    if [ $id -eq 0 ];then
       if [ “$mima” == “!!” -o “$mima” == “” ];then
           echo "$4" |passwd --stdin $2 &amp;&gt;/dev/null
            echo “$2密码已更新”
            exit 1
        else
           exit 1
       fi
    else
        useradd $2
        echo $4 |passwd --stdin $2 &nbsp;&amp;&gt;/dev/null
         echo “用户$2已创建并更新密码” 
      
    fi 
fi
unset decide
unset id
unset mima
1、编写脚本/root/bin/argsnumsh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

[   “$@”  ]&&(cat $1 |grep “^[[:space:]]$” |wc -l) ||(echo 至少应该给一个文件参数!;exit)

2、编写脚本/root/bin/hostping.h,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

ping -c1 -w1 $1 &> /dev/null && echo “该IP地址可以访问!”||echo”该IP地址不可访问!”

3、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
diskused_max=df | grep sd|sort -nr -k5|head -1|tr -s ' ' %|cut -d% -f5
inodeused_max=df -i| grep sd|sort -nr -k5|head -1|tr -s ' ' %|cut -d% -f5
[ “$diskused_max” -gt “80” ] && wall “空间即将满”||echo “空间使用率不超过80%”
[ “$inodeused_max” -gt “80” ] && wall “inode即将满”||echo “inode使用率不超过80%”他也
unset diskused_max inodeused_max 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
dev=df|grep "/dev/sd"|egrep -o "[0-9]{1,3}%"|sort -n|tail -n 1|cut -d% -f1
ino=df -i|egrep -o "[0-9]{1,3}%" |sort -n|tail -n 1|cut -d% -f1
[[ “$dev” -gt 80 ]] || [[ “$ino” -gt 80 ]] && echo $(wall 磁盘已满)||echo 还有很多利用空
间呦
unset dev

作业:

1、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
  export PATH=$PATH:/app/bin 
2、用户root登录时,将命令指示符变成红色,并自动启用如下别名:
rm=‘rm –i’cdnet=‘cd /etc/sysconfig/network-scripts/’
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’  (centos6.9)
editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-ens33 ’ (CentOS7) 
3、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
/etc/bashrc中或/etc/profile.d/
.sh echo -e ‘\033[31mHi,dangerous!\033[0m’ 3字体色 1红色
4、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等

!/bin/bash

——————————————

Filename:reset45.sh 

Revision: 1.0

Date: 20170807

Author: glx

Email:

Website:

Description:用户环境的初始化 

——————————————

“***********************脚本内容如下*********************”

别名的设置

echo ‘
alias rm=’rm -i’
alias vi=’vim’
alias cp=’cp -i’
alias l.=’ls -d .* –color=auto’
alias ll=’ls -l –color=auto’
alias ls=’ls –color=auto’
alias mv=’mv -i’
PS1=”[\033[01;32m]\u@\W\$[\033[00m] ” ‘ >> ~/.bashrc

登录提示符

echo ‘PS1=”[\033[01;32m]\u@\W\$[\033[00m] “‘ >> ~/.bashrc

环境变量的设置

echo ‘
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=/mnt/wwwroot/gofile ‘ >> ~/.bash_profile

. ~/.bashrc
. ~/.bash_profile

5、编写一个创建用户的脚本createyonghu.sh,执行该脚本不用输入任何参数,执行时会提示用户输入用户名,之后检测用户名是否存在,若存在直接提示用户已存在并退出,若不存在,再次提示用户输入密码,要求密码至少5个字符以上,仅可包含大小写及数字组成。 密码的输入过程不可见,且要求用户输入两次密码,两次不一致,直接退出。两次一致,则创建用户并将密码设置为指定密码后,提示用户及密码设置成功。

!/bin/bash

——————————————

Filename: createyonghu.sh   

Date:    2017-08-07 

Revision: 1.0

Author: 李甜甜

stdentID:16    

——————————————

read -p “请输入要新建的用户名:” username
if id $username &>/dev/null ; then 
        echo “用户已存在”;exit 1
else
        read -sp “请输入密码:”  passwd1 ; echo

        if [[ “$passwd1” =~  ^[[:alnum:]]{5,}$   ]] ; then 
                read -sp “请再次输入密码确认:” passwd2 ;echo

                if [ “$passwd1” == “$passwd2” ] ;then
                        useradd $username ; echo $passwd2 | passwd –stdin  $username &>/dev/null ;echo “用户及密码设置成功”
                else
                        echo “两次密码不一致”  ;exit 1 
                fi

        else
                echo “密码至少5个字符以上,仅可包含大小写字母及数字” 
                exit 2
        fi

fi

删除变量

unset username  passwd1 passwd2

原创文章,作者:MOMO,如若转载,请注明出处:/84543

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达娱乐主管QQ  万达招商QQ  万达注册  万达招商QQ  万达娱乐主管QQ  万达主管  万达娱乐注册  guoqibee.com  万达娱乐招商QQ