Linux之Shell编程

1、Shell脚本入门

注意事项:

  1. 以#!/bin/bash开头,以指定解析器;

  2. 执行方式;

    执行方式
    bash/sh进入子shell执行完后退出
    source/.在当前shell执行

    在子 shell 中设置的变量,父 shell 是不可见的。

在一个shell脚本中访问另一个shell脚本的方式

1.sh

#!/bin/bash
A=5

2.sh

#!/bin/bash
echo $A
  • 在不开启子shell的情况下执行1.sh,

    source 1.sh
    

    这种方式可以将A放置在当前shell中

  • 将A设为全局变量(环境变量)

    export A
    
  • 无论通过什么方式执行2.sh,均可访问到A

    bash 2.sh
    

1.1 系统变量

$HOME
$PWD
$SHELL
$PATH

1.2 自定义变量

注意事项:

  1. 由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写;
  2. 等号两侧不能有空格;
  3. 变量的值如果有空格,需要使用双引号或单引号括起来。
  4. 声明静态变量:readonly 变量,不能 unset取消变量。

1.3 特殊变量

$n #第几个参数
$# #输入参数个数
#这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$*
#这个变量代表命令行中所有的参数,$@把所有的参数区分对待
$@
#最后一次执行的命令的返回状态
$?
#!/bin/bash
#不加双引号时输出结果一样
echo '--------------$*-------------'
for i in $*
do
echo "$i"
done

echo '--------------$@----------------'
for j in $@
do
echo "$j"
done

[root@hadoop100 zyn]# bash test2.sh 111 222 333 444
--------------$*-------------
111
222
333
444
--------------$@----------------
111
222
333
444


#!/bin/bash
#加双引号时输出结果不样
echo '--------------$*-------------'
for i in "$*"
do
echo "$i"
done

echo '--------------$@----------------'
for j in "$@"
do
echo "$j"
done

[root@hadoop100 zyn]# vim test2.sh 
[root@hadoop100 zyn]# bash test2.sh 111 222 333 444
--------------$*-------------
111 222 333 444
--------------$@----------------
111
222
333
444

1.4 条件判断

  1. test condition
  2. [condition]

数值比较

符号解释
-eq等于
-ne不等于
-lt小于
-le小于等于
-gt大于
-ge大于等于

文件权限

符号解释
-r有读权限
-w有写权限
-x有执行权限

文件

符号解释
-e文件存在
-f是否为文件
-d是否为目录

多条件判断:

[atguigu@hadoop101 ~]$ [ atguigu ] && echo OK || echo notOK
OK
[atguigu@hadoop101 shells]$ [ ] && echo OK || echo notOK
notOK

2、流程控制

2.1 if判断

#单分支
if [ condition ];then
	程序
fiif [ condition ]
then
	程序
fi
#多分支
if [ condition ]
then
	程序
elif [ condition ]
then
	程序
else
	程序
fi

例子:

#!/bin/bash
if [ $1 -eq 1 ]
then
echo "11111"
elif [ $1 -eq 2 ]
then
echo "222222"
fi

2.2 case语句

格式:

case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
...
*)
默认程序
;;
esac

例子:

#!/bin/bash

case $1 in
"1")
echo "1111111"
;;
"2")
echo "2222222"
;;
*)
echo "******"
;;
esac

2.3 for循环

格式:

for (( 初始值;循环控制条件;变量变化 ))
do
	程序
done
或者
for 变量 in 值1 值2 值3
do
	程序
done

例子:

#!/bin/bash
sum=0
for (( i=0;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum
#!/bin/bash
for i in $*
do 
	echo $i
done

2.4 while循环

格式:

while [ 条件判断式 ]
do
	程序
done

案例:

#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum

3、read读取控制台

参数功能
-p提示语
-t指定等待时间
read -t 7 -p "在7s内输入你的名字:" NN
echo $NN

4、函数

4.1 内置函数

#取路径里的文件名称
basename 路径
basename /home/atguigu/banzhang.txt
basename /home/atguigu/banzhang.txt .txt
#取出文件的绝对路径
dirname 绝对路径
basename /home/atguigu/banzhang.txt

4.2 自定义函数

格式:

[ function ] funname[()]
{
	Action;
	[return int;]
}

注意事项:

  1. 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。
  2. 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)。

案例:

#!/bin/bash
function sum()
{
 s=0
 s=$[$1+$2]
 echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;

5、Shell工具

5.1 cut

参数含义
-f指定列
-d指定分隔符,默认"\t"
-c字符切割,指定列

案例:

[atguigu@hadoop101 shells]$ vim cut.txt
dong shen
guan zhen
wo  wo
lai  lai
le  le
#切割 cut.txt 第一列
[atguigu@hadoop101 shells]$ cut -d " " -f 1 cut.txt 
dong
guan
wo
lai
le
#切割 cut.txt 第二、三列
[atguigu@hadoop101 shells]$ cut -d " " -f 2,3 cut.txt
#切ip
[atguigu@hadoop101 shells]$ ifconfig ens33 | grep netmask | cut -d "i" -f 2 | cut -d " " -f 2

5.2 awk

参数功能
-F指定分割符
-v赋值一个用户变量

案例:

#搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 7 列
awk -F : '/^root/{print $7}' passwd
#搜索 passwd 文件以 root 关键字开头的所有行,并输出该行的第 1 列和第 7 列,中间以“,”号分割。
awk -F : '/^root/{print $1","$7}' passwd
#只显示/etc/passwd 的第一列和第七列,以逗号分割,且在所有行前面添加列名 user,shell 在最后一行添加"dahaige,/bin/zuishuai"。
awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd

#将 passwd 文件中的用户 id 增加数值 1 并输出
awk -v i=1 -F : '{print $3+i}' passwd

awk的内置变量

变量说明
FILENAME文件名
NR行号
NF切割后,列的个数

案例:

#统计passwd文件名,每行的行号,每行的列数
awk -F : '{print "filename:" FILENAME",linenum:" NR ",col:"NF}' passwd
#查询 ifconfig 命令输出结果中的空行所在的行号
ifconfig | awk '/^$/{print NR}'
#切割 IP
ifconfig ens33 | grep netmask | awk -F "inet" '{print $2}' | awk -F " " '{print $1}'

5.3 sort

参数说明
-n数值大小排序
-r相反顺序排序
-t分隔符
-k指定需要排序的列

案例:

[atguigu@hadoop101 shells]$ vim sort.txt
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6
#按照“:”分割后的第三列倒序排序。
sort -t : -nrk 3 sort.txt

5.4 wc

参数功能
-l统计文件行数
-w统计文件的单词数
-m统计文件的字符数
-c统计文件字节数

案例:

#统计/etc/profile 文件的行数、单词数、字节数!
wc -l /etc/profile
wc -w /etc/profile
wc -m /etc/profile

6、正则表达式

#^:以指定字符开头
cat /etc/passwd | grep ^a
#$:匹配指定字符结尾
cat /etc/passwd | grep t$
#.:匹配一个任意的字符
cat /etc/passwd | grep r..t
#*:匹配上一个字符 0 次或多次
cat /etc/passwd | grep ro*t
#[]:表示匹配某个范围内的一个字符
cat /etc/passwd | grep r[a,b,c]*t

[6,8]------匹配 6 或者 8

[0-9]------匹配一个 0-9 的数字

[0-9]*------匹配任意长度的数字字符串

[a-z]------匹配一个 a-z 之间的字符

[a-z]* ------匹配任意长度的字母字符串

[a-c, e-f]-匹配 a-c 或者 e-f 之间的任意字符

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 chmod命令的其他例子 6 1.4.5 可以选择使用符号模式或绝对模式 7 1.5 目录 7 1.6 suid/guid 7 1.6.1 为什么要使用suid/guid 8 1.6.2 设置suid/guid的例子 8 1.7 chown和chgrp 9 1.7.1 chown举例 9 1.7.2 chgrp举例 9 1.7.3 找出你所属于的用户组 9 1.7.4 找出其他用户所属于的组 10 1.8 umask 10 1.8.1 如何计算umask值 10 1.8.2 常用的umask值 11 1.9 符号链接 12 1.9.1 使用软链接来保存文件的多个映像 12 1.9.2 符号链接举例 12 1.10 小结 13 第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 3.1.7 删除crontab文件 25 3.1.8 恢复丢失的crontab文件 25 3.2 at命令 25 3.2.1 使用at命令提交命令或脚本 26 3.2.2 列出所提交的作业 27 3.2.3 清除一个作业 27 3.3 &命令 27 3.3.1 向后台提交命令 28 3.3.2 用ps命令查看进程 28 3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准错误 43 5.9 合并标准输出和标准错误 43 5.10 exec 44 5.11 使用文件描述符 44 5.12 小结 45 ... ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MelodyYN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值