shell 笔记

shell

shell 是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核

centos 默认的解析器是bash

脚本入门

helloworld

脚本以#!/bin/bash 开头(指定解析器)

helloworld

#!/bin/bash
echo "helloworld"

执行

  • (不赋予脚本+x权限)sh+脚本相对路径
  • ./文件绝对路径

多命令处理

#!/bin/bash
cd /home/atguigu
touch cls.txt
echo "helloworld">>cls.txt

变量

系统变量

H O M E , HOME, HOME,PWD, S H E L L , SHELL, SHELL,USER

自定义变量

基本语法

  • 定义变量:变量=值 等号两边不能有空格

    [root@hadoop102 datas]# a=5
    [root@hadoop102 datas]# echo $a
    5
    
  • 撤销变量:unset变量\

  • 声明静态变量:readonly变量,注意:不能unset 虚拟机重启能消

变量定义规则

  • 变量名称可以由字母,数字和下划线组成,但是不能以数字开头,环境变量名建议大写

  • 等号两侧不能由空格

  • 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

  • 变量的值如果有空格,需要使用双引号或单引号括起来

  • 可把变量提升为全局环境变量,可供其他shell程序使用

    export 变量名

    export B
    

特殊变量:$n

$n(功能描述:n为数字,$0代表该脚本名称,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 9{10})

[root@hadoop102 datas]# bash parameter.sh 1 2
parameter.sh 1 2
  • $# (功能描述:获取所有输入参数个数,常用于循环)
  • ∗ ( 功 能 描 述 : 这 个 变 量 代 表 命 令 行 中 所 有 的 参 数 , * (功能描述:这个变量代表命令行中所有的参数, (*把所有的参数看成一个整体)
  • @ ( 功 能 描 述 : 这 个 变 量 也 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @(功能描述:这个变量也代表命令行中所有的参数,不过 @@把每个参数区分对待)
  • $? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了)

运算符

  1. ( ( 运 算 式 ) ) “ 或 ” ((运算式))“或” (())[运算式]“

  2. expr +,-,\ *,/,% 加 减 乘 除 取余——注意:expr运算符间要有空格

    expr 3 - 2
    
  3. 优先执行语句

    expr `expr 2 + 3` \* 4
    s=$[(2+3)*4]
    echo $s
    

条件判断

基本语法 是要有中括号

[condition] (注意condition 前后要有空格)

注意:条件非空即为true,[atguigu]返回true,返回false

[ 22 -lt 23 ]

常用判断条件

  1. 两个整数之间比较

    = 字符串比较

    -lt 小于(less than)-le 小于等于(less than)
    -eq 等于 (equal)-gt 大于(greater than)
    -ge 大于等于 (greater equal)-ne 不等于(Not equal)
  2. 按照文件权限进行判断

    -r 有读的权限(read)

    -w 有写的权限(write)

    -x 有执行的权限(execute)

  3. 按照文件类型进行判断

    -f 文件存在并且是一个常规文件(file)

    -e 文件存在(exitence)

    -d 文件存在并是一个目录(directory)

多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令失败后,才执行下一条命令)

流程控制(重点)

if 判断

if [ 条件判断式 ];then
	程序
fi
或者
elif [ 条件判断式 ];
  then
	程序
fi

注意:

  • [ 条件判断式 ],中括号和条件判断式之间必须有空格
  • if后要有空格

case 语句

基本语法

case $变量名 in
"值1")
	如果变量的值等于值1,则执行程序1
	;;
"值2")
	如果变量的值等于值2,则执行程序2
	;;
	...省略其他分支...
*)
	如果变量的值都不是以上的值,则执行此程序
	;;
esac

注意事项

  1. case行尾必须为单词 in ,每一个模式匹配必须以右括号 )结束
  2. 双分号 ;; 表示命令序列结束,相当于Java中的break
  3. 最后的 *) 表示默认模式,相当于java中的default
case $1 in
1)
	echo "banzhang"
;;
2)
	echo "cls"
;;
*)
	echo "renyao"
;;
esac

for 循环

基本语法1
for((初始值;循环控制条件;变量变化))
 do
 	程序
 done
 
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
	s=$[$s+$i]
done
echo $s
基本语法2
for 变量 in 值1 值2 值3...
do
	程序
done

#!/bin/bash
for i in $*
do
	echo "dashi $i"
done
for i in $@
do
	echo "dashi $i"
done

while 循环

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

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

echo $s

read读取控制台输入

read(选项)(参数)

选项:

-p:指定读取值时的提示符

-t:指定读取值时等待的时间(秒)

参数

变量:指定读取值的变量名

#!/bin/bash
read -t 7 -p "Enter your name in 7 seconds" NAME
echo $NAME

函数

系统函数

basename基本语法

basename [string/pathname] [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来)

选项

suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉

basename /home/atguigu/banzhang.txt
banzhang.txt
basename /home/atguigu/banzhang.txt .txt
banzhang.txt

dirname基本语法

dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

dirname /home/atguigu/banzhang.txt 
/home/atguigu

自定义函数

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

经验

  1. 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其他语言一样先编译
  2. 函数返回值,只能通过$?系统变量获得,可以显示加;return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值 n(0-255)
#!/bin/bash
function sum()
{
	s=0;
	s=$[$1+$2]
	echo $s
}

read -p "input your paratemer1:" P1
read -p "input your paratemer2:" P2

sum $P1 $P2

shell 工具(重点)

cut

cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出

基本用法

cut[选项参数] filename

说明:默认分隔符是制表符

选项参数功能
-f列号,提取第几列
-d分隔符,按照指定分隔符分割列
vim cut.txt
dong shen
guan zhen
wo  wo
lai lai
le le
cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le

在cut.txt文件中切割出guan

选取系统PATH变量值,第2个“:” 开始后的所有路径

cat cut.txt | grep "guan" | cut -d " " -f 1
echo $PATH | cut -d: -f 2

切割ifconifg 后打印的IP地址

ifconfig eth0 | grep "inet addr" | cut -d: -f 2 | cut -d " " -f 1

sed

sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行吗,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

  • 基本用法

    sed [ 选项参数 ] ‘command’ filename

  • 选项参数说明

    -e 直接在指令列模式上进行sed的动作编辑

  • 命令功能描述

    a 新增,a的后面可以接字符串,在下一行出现

    d 删除

    s 查找并替换

vim sed.txt
dong shen
guan zhen
wo wo
lai lai

le le

sed "2a mei nv" sed.txt
dong shen
guan zhen
mei nv
wo wo
lai lai

le le

删除sed.txt文件所有包含wo的行

将sed.txt文件中的wo替换为ni

将sed.txt文件中的第二行删除并将wo替换为ni

sed '/wo/d' sed.txt
sed 's/wo/ni/g' sed,txt
sed -e '2d' -e 's/wo/ni/g' sed.txt

注意:‘g’表示global,全部替换

awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理

  • 基本用法

    awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename

    pattern:表示awk在数据中查找的内容,就是匹配模式

    action:在找到匹配内容时所执行的一系列命令

  • 选项参数说明

    选项参数功能
    -F指定输入文件折分隔符
    -v赋值一个用户定义变量
  • 案例实操

搜索passwd 文件以root 关键字开头的所有行,并输出该行的第7列

搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以”,“号分隔

只显示/etc/passwd 的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加”dahaige,/bin/zuishuai“

awk -F: '/^root/{print $7}' passwd /bin/bash
awk -F: '/^root/{print $1","$7}' passwd
awk -F: 'BEGIN{print "user,shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd

注意:只有匹配了pattern的行才会执行action

将passwd文件中的用户id增加数值1并输出

注意:BEGIN 在所有数据读取行之前执行;END 在所有数据之后执行

awk 的内置变量
变量说明
FILENAME文件名
NR已读的记录数
NF浏览记录的域的个数(切割后,列的个数)
awk -F : '{print FILENAME "," NR "," NF}' passwd

查询sed.txt 中空行所在的行号

awk '/^$/{print NR}' sed.txt
5

正则表达式

sort

基本语法 sort(选项)(参数)

选项说明
-n依照数值的大小排序
-r以相反的顺序来排序
-t设置排序时所用的分隔字符
-k指定需要排序的列

参数:指定待排序的文件列表

按照 ”:“ 分割后的第三列倒序排序

sort -t : -nrk 3 sort.sh

面试

  • 京东

    问题1:使用linux命令查询file1中空行所在的行号

    awk '/^$/{print NR}' sed.txt
    

    问题2:有文件chengji.txt内容如下

    张三 40

    李四 50

    王五 60

    cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}'
    
  • 搜狐&和讯网

    问题1:shell 脚本里如何检查一个文件是否存在?如果不存在该如何处理?

    #! /bin/bash
    
    if [ -f file.txt ];then
    	echo "文件存在!"
    else
    	echo "文件不存在!"
    fi
    
  • 新浪

    问题1:用shell写一个脚本,对文本中无序的一列数字排序

    sort -n test.txt | awk '{a+=$0;print $0}END{print "S"}'
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值