shell 小结

正则表达式

  • ^以..开头 $以..结尾 ^$空行
  • . 代表任意一个字符 *重复0个或多个前面字符
  • ^ .* 以任意多个字符开头
  • [abc] 匹配abc任意字符
    -[^abc] 除了abc以外的所有字符
    -x{m} 重复字符x m次 egrep 和 sed -r 可以不转义字符
  • 小例子 取ip地址
    ifconfig ens33|sed -n "2p"| sed -r "s/^.*inet (.*) netmask.*$/\1/g"
    通配符 ?一个字符 *代表所有
  • sort -nr 以数值倒序排序

定时任务

  • 分时日月周
    00 23 * * * 23:00
    范围 00 17-19 * * *
    30 3-5,17-19 * * * 每天 17-19 30分 每天 3~5 30分
  • 00 23-07/1 * * * 23点到早上七点 每小时重启
  • 00-59, 00-23, 01-31,1-12, 0-6
    执行脚本前 /bin/sh
    把输出重定向到 >/dev/null/ 2>1 时间变量用反斜线转义,为了避免转义问题 定时任务做好用脚本 date+%F-%H-%M 00 23 * * * cd /etc/ && tar zcf /tmp/service_(date+%F-H).tar.gz ./services
    直接/etc/services 压缩包会包含目录/etc/services

shell变量

截取变量:echo {var:0:5} 其中的 0 表示左边第一个字符开始,5 表示字符的总个数。 \> message 清空message里的内容 . test.sh 子shell变量保存到了父shell Export 仅对子shell有效 a" 解析定义的$a变量,单引号不解析
${cmd}_oldboy {}指定变量为cmd
cut -c 1-10 以字符为单位 取1-10

  • 批量修改文件
    把wenxuepiao_1_.jpg, wenxuepiao_2_.jpg .... 其中wenxuepiao字段修改为piaowenxue
#sed 方法
for i in `ls *.jpg`
do
   mv $i  `echo $i | sed "s/wenxuepiao/piaowenxue/g"`
done

#rename 方法
rename wenxuepiao piaowenxue   *.jpg
  • 检查网站是否正常
curl -I -s baidu.com | head -1
#结果
HTTP/1.1 200 OK

$0 获取执行脚本的文件名 包括路径
$n, n=1..9 第n个参数
$#参数的总个数
$* 等同于 “$1$2$3” 1" "$2" "$3"
${#string} 返回$string的长度

变量值计算
let i=i+1 i--
read -p "please input " var
read -t (timeout) : read -t 3 var
[[]] 支持 && || > < 但不能使用>=

  • test -f 文件
    ! -f 非文件
    -n 判断字符串的长度不为0 则真
    -z 长度是否为零
    字符串测试用 “”引号:[[ -n "$a" ]]
    [[ -f "test.sh" ]] && echo 1||echo 0 简单的if用法 为真返回1 为假返回0
    [[ 3==4 ]] || {echo 1 echo2} 大括号可以写多个命令
  • nmap,telnet 可以查看远程端口是否开启
  • $? 判断程序是否执行正确 : $? 判断url curl baidu.com
  • while [[ ]] do done
  • {a..z} for i in 10.0.0.{1..254}
  • echo "redhat" | passwd --stdin hive 修改hive用户密码为redhat
  • 数组
    array=(1 2 3)
    长度 echo {array[0]}
    添加 array=(array[@]/2/3}
    随机数 (($RANDOM%50+1))

    批量创建用户

for i in {01..10}
do
useradd oldboy_${i}
echo "fai" | passwd --stdin oldboy_${i}
done

判断10.0.0.0/24网络里, 当前在线用户的ip有哪些

···
for i in seq 1 255
do
ping -c 1 10.0.0.? == 0 ]]
then
echo "10.0.0.i is down"
fi
···

eval

  • eval会对后面命令进行两次扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令;如果命令中含有变量的间接引用, 则保证间接引用的语义。
  • shell 小结_第1张图片
    image.png
  • a=4 b=a eval echo '$' "$b"

定义间接变量:https://www.zhihu.com/question/36459017

你可能感兴趣的:(shell 小结)