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.www58058.com/84543