shell之基础知识

1.shell脚本
需要的命令保存在文本中,然后执行它
每天晚上9:30 打包/data目录下所有文件,复制到192.169.7.3(文件服务器)的/opt下
shell脚本=若干命令+脚本的基本格式+特定语法
2.什么时候使用脚本
重复、复杂的工作通过命令写成脚本,以后通过脚本就可以完成任务
3.怎样学习
a.记命令
b.掌握标准格式
c.基本语法
    变量定义
    条件判断
    分支
    循环
    函数
    传惨
    sed
    awk
4.脚本的执行
a.通过绝对路径执行
通过绝对路径执行脚本文件需要注意,该文件必须有执行权限才能通过该方式执行
修改权限chmod a+x 文件
bash: /home/heygor/0827/shell/day-01.sh: 权限不够
chmod a+x /home/heygor/0827/shell/day-01.sh
/home/heygor/0827/shell/day-01.sh
b.通过相对路径执行
通过相对路径ahing脚本文件也一样,必须有执行权限才能执行
 ./day-02.sh
c.通过bash或者sh执行
通过bash或者sh执行不需要提前设置文件权限,直接使用就可以
sh day-03.sh
bash day-03.sh
5.变量的定义和使用
a.变量的定义
变量名字和变量值都是自定义的,用户可以进行控制修改
a1.命名规则
    变量名可以有字母、数字、下划线组成,必须字母和下划线开头
    变量名产读不能超过255
    变量名在有效范围必须唯一
    在脚本中,某人类型都是字符串
a2.变量存储类型
    字符串类型,赋值时候单、双引号都可以
    整型
    浮点型
    日期型
a3.变量定义
    变量名=变量值
    注意:等号左右不能有空格
    a=10
    b=20
    c='heygor'
b.变量的调用
变量的调用通常作为输出,在变量名字前面增加$,进行性打印即可
    a=20
    echo $a
    a='heygor'
    echo $a
d.变量的查看
可以查询当前系统运行的所有变量,包括系统变量和用户变量
    set
e.变量的删除
unset x     注意:unset并不是删除变量里面的值,而是删除变量,变量名前面不需要加$
    unset a
6.定义变量
定义变量通常2种方式
a.系统变量
系统变量可以用于定义shell的运行环境,环境变量可以在配置文件中进行定义和修改,也可以在命令行中设置,但是在命令行中设置重启终端后就会失效,最好在配置文件中进行修改(/etc/profile;~/.bashrc;~/.bash_profile),将环境变量放在配置文件中,每次登陆时后这些变量进行初始化
在.bashrc中最后一行添加 date | awk -F " " '{print $2,$3}',打开新终端后,直接显示日期
b.本地变量
在用户当前的shell生存其脚本使用
测试:打开终端设置变量输出,打开另外一个终端,显示变量输出
7.变量的赋值
1.直接赋值
等号左侧为变量名字,右侧为变量的值
a=20
a='heygor'
2.间接赋值
`` 反斜线代表先执行斜线中命令,然后把执行结果赋予变量
name=`hostname`
echo $name
ip=`ifconfig |grep inet`
echo $ip
3.交互赋值
read命令可以接受间哦按输入,并且赋值给变量
read -p "your name is : " username
echo $username
7.变量的位置参数进行赋值
通常脚本后面跟的第一个参数为$1,第二个参数为$2,以此类推
修改vim day-05.sh
findpath="$1"
find $findpath -name day-05.sh
执行
./day06 /home/heygor

修改vim day-06.sh
echo "第一个参数是 $1"
echo "第二个参数是 $2"
echo "第三个参数是 $3"

8.变量的运算
a.通过let方式
a=100
b=30
let c=a+b
echo $c
b.通过$()方式
a=20
b=30
c=$((a+b))
c.通过``方式
``先执行内部命令
now=`date | awk -F " " '{print $5}'`
echo $now
9.条件判断
shell编程中test命令,可以通过man test查看条件判断语法
条件判断在脚本中以if关键字开头fi关键字结尾,test等价与[]
a.单分支
if [ 条件 ];then
    执行语句
fi
b.双分支
if [ 条件 ];then
    执行语句
eles
    执行语句
fi
c.多分支
if [ 条件 ];then
    执行语句
elif [条件];then
    执行语句
...
else
    执行语句
fi
d.条件判断常见参数
    -f 是否存在(文件)
        test -f /etc/passwd
        如果条件成立,返回码是$?=0
        [ -f /etc/passwd ]
        [ -f /etc ]
    -e 不管是文件还是目录存在条件就成立
    -n 字符串为非空就是成立
    -z 字符床长度为0就成里
    字符串的对比 =   !=,不能用于数值大小的判断
    -eq 等于
    -ne 不等于
    -lt 小于
    -gt 大于
    -gte大于等于
    -lte 小于等于
    逻辑判断符号
    -a and(逻辑与) 同时满足条件
    -o or(逻辑或)  满足一个条件即可
#read -p "your name is " user
#echo $user
#if [ $user='heygor' ];then
#       echo 'creazy!!!!'
#fi
if [ -f /etc/passwd1 ];then
        echo 'file exxists!'
else
        echo 'mu zhao dao'
fi

ls /etc/dadsadsads
if [ $? = "0" ];then
        echo 'its your hostname'
else
        echo 'WTF'
fi
   

10.循环
a.for循环
for循环就是遍历,访问序列中每一个元素
for i in 1 2 3 4
do
    echo "no.$i"
done
echo "finished"

for i in `seq 10`
do
    useradd usera$i
done
for ((i=1;i<=10;i++))
do
        sudo userdel -r heyor$i
done
判断局域网中哪些IP可以用,哪些不可以用(写脚本)
b.while循环
while 条件
do
    执行语句
done

while TRUE
do
    执行语句
done

猜数字

rannum=$(($RANDOM%10)) #产生一个随机数
guest=100              #设置变量
echo $rannum           #提示

while [ "$guest" -ne "$rannum" ]
do
        read -p "guset num: " guest
done

echo "number is $rannum"

需求:每次提示大了或者小了

1.awk
文本的行处理工具
awk options file
查看ip地址
ifconfig ens33 |grep 255 |awk  -F ":" '{print $2}'|awk -F " " '{print $1}'
awk -F ":" '{print $1}'   /etc/passwd   打印文件的第一列
awk -F ":" '{print $1,$6}' /etc/passwd  打印文件的第一列和第六列
awk -F ":" '{print $1":"$6}' /etc/passwd打印文件第一列和第六列,用冒号分割

$1,$2......$N 表示第几列
 awk -F ":" '{print $1,$6}' /etc/passwd

$0            表示一整行
 awk -F ":" '{print $0}' /etc/passwd

$NF           表示最后一列
awk -F ":" '{print $NF}' /etc/passwd

NF          标识每行有多少列
head -1 /etc/passwd |awk -F ":" '{print NF}'

NR          标识当前行号
head -10 /etc/passwd |awk -F ":" '{print NR,$1}'

awk的关系操作符
==     等于
!=    不等于
>=      大于等于
<=      小于等于
<    小于
>    大于

awk的逻辑操作符
&&     逻辑与    真&&真==>真
||     逻辑或   假||假==>假
!     逻辑非
打印行号
awk -F ":" '{print NR}' /etc/passwd
打印第8行
awk -F ":" 'NR==8{print;exit}' /etc/passwd
打印字段数(列数)大于4的行
awk -F ":" 'NF>4{print}' /etc/passwd
打印第5行到第10行
awk -F ":" 'NR>=5&&NR<=10{print NR,$0}' /etc/passwd
打印UID在30-100范围内的用户名
awk -F ":" '$3>=30&&$3<=100{print $1,$3}' /etc/passwd

awk -F "分隔符" 'BEGIN{ 处理文件前执行的代码块 }{ 处理文件过程中执行的 }END{ 处理文件后执行的代码 }'
输出顶部增加' begin '
输出最后增加' finish '
//
awk -F ":" 'BEGIN{ print "begin yeah!" }{ print $1 }END{print "finish!!!"}' passwd
注意:如果内容太多,可以通过 |more来进行查看

打印文件最后一行的最后一列
tail -1 passwd  |awk -F ":" '{print $NF}'
awk -F ":" 'END{ print $NF }' passwd

打印字段数大于4的总行数
awk -F ":" 'NF>4{print}' /etc/passwd |wc -l
awk -F ":" 'BEGIN{ count=0 }NF>4{ count++ }END{ print count }' passwd

把AWK代码写入独立文件中执行
01.awk
BEGIN{
    FS=":"
    count=0
}
{
    if( NF>4 ){
        count++
    }
}
END{
    print count
}
执行时候使用 awk -f 01.awk passwd
2.sed
字段编辑和字段替换
删除指令 d 在查看时候屏蔽某些信息
删除所有行          sed -e 'd' mypass
删除第一行          sed -e '1d' mypass
删除1到3行        sed -e '1,3d' mypass
删除第1行和第3行     sed -e '1d;3d' mypass
删除包含root关键字的行  sed -e '/root/d' mypass
删除daemon开头的所有行  sed -e '/^daemon/d' mypass
删除bash结尾的所有行    sed -e '/bash$/d' mypass
删除所有空行            sed -e '/^$/d' mypass
删除所有以#开头的行     sed -e '/^#/d' mypass

打印所有行
sed -n -e '' mypass
sed -n -e 'p' mypass
打印第一行和第三行
sed -n -e '1p;3p' mypass
匹配管理员开的行打印
sed -n -e '/^root/p' mypass
匹配以nologin结尾的进行打印
sed -n -e '/nologin$/p' mypass

替换命令,显示、打印时候替换
每行搜到的第一个root关键字替换为admin
sed -e 's/root/admin/' mypass
每行找到所有n关键字替换为admin
sed -e 's/n/admin/g' mypass
只替换2-10行:为-
sed -e '2,10s/:/-/g' mypass

把结果保存到源文件中
sed -i '/^root/d' mypass

使用域进行定位
echo "28-08-2018"
echo "28-08-2018" |awk -F "-" '{print $3"-"$2"-"$1}'
echo "28-08-2018" |sed -r 's/(..)-(..)-(....)/\3-\1-\2/'
echo "come on,baby" |sed -r 's/(.*),(.*)/\2,\1/'
删除每行的第二个字符
cat test |sed -r 's/(.)(.)(.*)/\1\3/'
删除最后一个字符
echo "can you see me?" |sed -r 's/(.*)(.)/\1/'
删除倒数第二个字符
echo "can you see me?" |sed -r 's/(.*)(.)(.)/\1\3/'

猜你喜欢

转载自blog.csdn.net/YeChao3/article/details/82502123