Shell 脚本学习1

目录

1.批量生成

2.批量修改

3. 批量生产用户

4. 生产随机密码

5. 批量判断网络10.0.0.内的主机是否通信

6.sed 命令使用

7.gawk 命令使用

8.gawk 正则表达式

9.sed 单词替换空白行处理

10.sed 处理文本反转脚本

11.sed 清除HTML标签

12. $特殊字符含义

13.for 循环 使用注意


 

1.批量生成

[ -d ./oldboy ] || mkdir ./oldboy
cd ./oldboy
echo $(pwd) && \
#此处的单引号是电脑键盘左上角上的点
for i in `seq 1 10`
do
    filename=$(uuidgen|tr '0-9' 'a-z' |cut -c 1-10)
    touch ${filename}_oldboy.html
done

2.批量修改

#文件目录的组成
dir=$(pwd)/oldboy
echo "$dir"
if [ ! -d "$dir" ] 
then
    echo "$dir not exist"
    return exit 0
fi
cd $dir && \
for i in $(ls *html)
    do
        ranStr=$(echo $i| cut -c -10)
        mv $i ${ranStr}_oldgirl.html
    done

3. 批量生产用户

[ -d ./oldboy ] || mkdir ./oldboy
cd ./oldboy
echo $(pwd) && \
source /etc/init.d/functions
#定位到action的执行
for i in oldboy{01..03}
do
    useradd $i &>/dev/null# &> 等于2 也就是STDERR, > 等于1 STDOUT
    if [ $? -eq 0 ];#上一句执行结果
        then
        #表示用户添加成功 显示ok 绿色
        #uuidgen 生成随机密码,截取数字为小写字母 取10个字符
        action "$i" /bin/true
        echo $(uuidgen|tr '0-9' 'a-z' | cut -c 1-10)|passwd --stdin $i &>/dev/null
        echo $i $(uuidgen|tr '0-9' 'a-z' | cut -c 1-10) >>/tmp/passwd.txt
    else
#表示用户添加失败 显示 FALSE 红色
        action "$i" /bin/false
    fi
done

 

4. 生产随机密码

日期和随机数生成md5 值,取随机的1-8个字符

randomPass="`date`$RANDOM"|md5sum|cut -c 1-8
echo ${randomPass}

#生成16进制密码
uuidgen 

#进程ID版本,数字密码
echo $$

5. 批量判断网络10.0.0.内的主机是否通信

#!/bin/bash
source /etc/init.d/functions
#source 命令也可使用 . /etc/init.d/functions 命令来导入功能函数库
for i in 10.0.0.{1..254}
do
{
  ping -c 2 -w 2 $i &>/dev/null
  if [ $? -eq 0 ];then
      echo $i is ok!
      action $i /bin/true
  else
      echo $i is donwn! >>/tmp/ip_down.txt
      action $i /bin/false  
  fi
}&
done

6.sed 命令使用

#!/bin/bash
#test sed command
sed -e 's/brown/green/;s/dog/cat/' data1
#data1 为文件名 
#-e 表示多条命令 命令之间用“;”隔开,不允许有空格
#s 命令替换 brown为green,dog为cat,即第一个斜杠内容替换为第二个斜杠内容

7.gawk 命令使用

#!/bin/bash
gawk -F: -f script1 /etc/passwd

#-F: 选项表示内容每行分割符是:

#-f script1 指定读取script1文件中的命令

#script1文件内容{ print $1 " 's home directory is " $6}

#/etc/passwd 为处理的目标文件

8.gawk 正则表达式

#!/bin/bash
# exercise the regular expression
#匹配Email地址
gawk --re-interval '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}'

#^([a-zA-Z0-9_\-\.\+]+)  匹配字母数字加 _ - . + 特殊字符用转义 \ 之后+至少一次
#([a-zA-Z0-9_\-\.]+)\. 域名部分也是一样匹配 
#顶级域名([a-zA-Z]{2,5})$ 以字母为主,2到5个字符


#匹配美国电话号码

gawk --re-interval '/^\(?[2-9][0-9]{2}\)?(| |-|\.)[0-9]{3}( |-|\.)[0-9]{4}$/{print $0}'

#电话号码格式 (123)-555-890

#^\(? 开头匹配左括号 一次或没有
#[2-9][0-9]{2} 要求第一个数字是2-9之间数字,后面跟两个数字
#\)? 匹配开头右边括号一次或没有
#(| |-|\.) 后面跟个空格 - 或 . 特殊字符
#[0-9]{3} 匹配3个数字
#( |-|\.) 匹配空格或 - 或 . 特殊字符
#[0-9]{4}$ 结尾匹配4个数字

9.sed 单词替换空白行处理

#!/bin/bash
:<<!
data2 内容
This is the header line
This is the second line
This is the last line
!
#G 命令用来在所有行后插入 空白行
$sed 'G' data2
#如果不在最后一行插入空白行,$代表最后一行
$sed '$!G' data2
#文本内容原本就有空白行
:<<!
This is the haeder line

This is the second line

This is the last line


!
#这个时候可以先删除所有空白行,^$/d 删除空白行在用G插入空白行
#$!G $ 表示最后一行,!G 表示命令不作用,命令如下
$sed -e '/^$/d;$!G' data2

#sed 单词替换
$echo "The cat sleeps in his hat." | sed 's/.at/"&"/g'
$The "cat" sleeps in his "hat".
# & 代表通配符匹配的内容,g表示匹配全部

$echo "The system admin manul" | sed 's/\(system\) admin/\1 user/'
#将system admin 替换为\1 user,\1 为() 提取的子字符串模块 system
#替换结果为 The system user manul
$echo "The furry hat is pretty" | sed 's/furry \(.at\)/\1/'
$The hat is pretty
$echo "The furry cat is pretty" | sed 's/furry \(.at\)/\1/'
$The cat is pretty

#匹配数字3位. 号
$ echo "1234567" | sed '{:start;s/\(.*[0-9]\)\([0-9]\{3\}\)/\1.\2/;t start}'
1.234.567
#.*[0-9] 以数字结尾的任意长度字符,[0-9]{3} 3位数字组成的字符串 用() 来表示为\1 \2 提取匹配
#t 类似如小型 if then 语句跳转

10.sed 处理文本反转脚本

#!/bin/bash
# test shell script 
sed -n '{
1!G
h
$p    
}' $1

#-n 表示不及时输出,1!G 第一行不处理保持空间追加到模式空间
#其他行保持空间追加到模式空间
#h 模式空间复制到保持空间
#$p 打印输出
# $1 读取脚步执行第一个参数

11.sed 清除HTML标签

#!/bin/bash
#filter the html tag
$sed 's/<[^>]*>//g;/^$/d' data3
# 中间用[^>] 来保证标签匹配的正确性
#/^$/d用来删除空白行
#data3 内容
:<<!
<html>
<head>
<title>This is the page title</title>
</head>
<body>
<p>
This is the <b>first</b> line in the web page.This should provide some <i> useful</i>
information for us to use in our shell script.
</p>
</body>
</html>
!

12. $特殊字符含义

$0 表示脚本名称
$1 表示第一个参数 $2 表示第二个参数 $3 表示第三个参数

$@ 表示所有参数为字符串列表
$* 表示所有参数为一个字符串

#举例./t.sh 1 2 3 执行,$@ 代码 "1" "2" "3" ,$*表示 “1 2 3”
#$@ 在for 不带 in [list] 时是其默认选项, 举例

for option
do
    echo $option
done

#以上脚本就依次读取脚本运行是指定的参数了


$? 表示上一条脚本命令执行的结果,退出码
#一般 if [ $? eq 0 ]; then echo "excute successed!" 判断上一条命令是否执行成功

$$ 表示脚本运行时的PID

13.for 循环 使用注意

t.sh 文件内容
#!/bin/bash
for option
do
    echo $option
done

#当 for 不使用 in [list] 默认 使用$@ 读取默认参数列表

#具体执行情况如下
./t.sh 1 2 3 
#输出
1
2
3

#此种情况 $@ 表示"1"  "2"  "3" , $* 表示 “1 2 3”


14.cat << END 解释

cat << END
 
hello 

world

END

#cat << END 就是 把 cat << END END 之间的内容输出到屏幕,END 没有特殊意思,只是使用而已,
#也可以用其他字符,如 CONTENT
#cat << 这种用法可以参考 here documents

#!/bin/bash

read -p "Input yes:" help
#read -p 提示读取屏幕信息到help 变量,加上选项-s 表示读取的输入信息不再屏幕显示,一般用于
#读取用户密码如 read -p "input your password:" -s pass

if [ $help = yes ]; then
cat << CONTENT
hello

--help
--prefix=PATH
--sbin-path=PATH
--lock-path=PATH
CONTENT

fi

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值