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 &>/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:]]\|_\)*$" &>/dev/null;echo $?)
判断用户是否存在,并给出返回值
id=id $2 &>/dev/null;echo $?
截取用户密码位
mima=getent 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 &>/dev/null
echo “$2密码已更新”
exit 1
else
exit 1
fi
else
useradd $2
echo $4 |passwd --stdin $2 &>/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,如若转载,请注明出处:http://www.178linux.com/84543