shell入门

shell

介绍:命令行解释器

作用:接收用户命令,操作调用内核

特点:易编写、调试、灵活性强

shell解释器

1
sudo cat /etc/shells

入门

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

创建

1
touch helloword.sh

编写

1
vim helloword.sh
1
2
#!/bin/bash
echo "hello word"

执行

1
sh helloword.sh

shell变量

常用

$HOME、$PWD、$SHELL、#USER

自定义

(1)定义:变量=值

(2)撤销:unset 变量

(3)声明静态变量:readonly变量,注意不能unset

规则

(1)变量名由字母、数字、下划线组成,不能以数字开头,环境变量名建议大写

(2)等号两侧不能由空格

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

(4)变量值如果有空格,需要用双引号或单引号括起来。

(5)全局变量:export 变量名

特殊变量

$n

传递给脚本或函数的参数。n 是一个数字,表示第几个参数。$0代表脚本名称,$1-9表示参数,例如,第一个参数是 $1,第二个参数是 $2。

$#

传递给脚本或函数的参数个数。

$*

传递给脚本或函数的所有参数。

$@

传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同

$?

上个命令的退出状态,或函数的返回值,值为0-正常执行,非0-执行失败

$$

当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

运算符

1.基本语法

  1. “$((运算式))”或“$[运算式]”
  2. expr +,-,\*,/,%(加减乘除取余)

注意:expr运算符间有空格

example

1
2
3
4
#计算2+3的值

[root]$ expr 2 + 3
5

条件判断

1.基本语法

[ condition ] (condition前后有空格)

  • 条件非空为true

常用判断

(1)整数比较

​ =字符串比较

​ -lt 小于(less than) -le 小于等于(less equal)

​ -eq 等于(equal) -gt大于(greater than)

​ -ge大于等于(greater equal) -ne不等于(not equal)

example

1
2
3
4
5
6
#22是否小于等于23

[ 22 -le 23]

#根据输出判断执行
echo $?

(2)按照权限判断

-r 只读(read) -w写入(write)

-x 执行(execute)

example

1
2
3
4
5
6
#x.sh是否具有写入权限

[ -w x.sh]

#根据输出判断执行
echo $?

(3)按文件类型

-f 文件存在且为file -d文件存在且为目录

-e文件存在

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

流程控制

if

1.基本语法

1
2
3
4
5
6
7
if [ 判读式 ]:then

执行式
elif [ 判读式 ]:then
执行式

fi

或者

1
2
3
4
5
6
7
8
9
if [ 判读式 ]

then

执行式
elif [ 判读式 ]then
执行式

fi
  • 判读式前后有空格
  • if后有空格

case

1.基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
case $变量名 in

"值1")

变量值为1则执行

;;

"值2")

变量值为2则执行

;;

*)

default语句

;;

esac

case结尾必须为in,每个case判断以有括号”)”结束

for

1.基本语法1

1
2
3
4
for (( 初始值;循环条件;变量变化 ))
do
执行
done

example

从1累加到100

1
2
3
4
5
6
7
8
#!/bin/bash/

s=0
for ((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo $s

2.基本语法2

for each

1
2
3
4
for 变量 in 值1 值2 值3...
do
执行语句
done

example

从1累加到100

1
2
3
4
5
6
7
8
9
#!/bin/bash/
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s + $i]
i=$[$i + 1]
done
echo $s

read

1.基本语法

read(选项)(参数)

选项:

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

​ -t:指定读取值时等待的时间

参数

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

example

1
read -t

函数

系统函数

basename

语法:basename[string/pathname] [suffix]

(描述:basename命令会删掉最后一个/之前的所有前缀包括”/“字符并将剩下的字符串print)

选项:

suffix为后缀,如果被指定,basename回家pathname或string中的suffix去掉

dirname

语法:dirname 绝对路径

(描述:从给定绝对路径的文件名中去除文件名并保留下路径信息)

自定义

[ function ] funname[()]

{

​ action;

​ [return int;]

}

funname

  • shell是脚本语言,调用函数前必须先声明
  • 函数返回值只能通过$?获取,加return返回,不叫将以最后一条命令结果作为返回值

example

两数和

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash/

function sum()
{
s=0;
s=$[$1+$2]
echo $s
}
read -p "输入一" p1
read -p "输入二" p2
sum $p1 $p2

cut

cut的作用”剪”,负责在文件或输出中截切字段、字符输出

1.基本语法

cut [选项参数] filename

默认分隔符是制表符

参数

  • ​ -f 列号,提取指定序列
  • ​ -d 分隔符,按指定分隔符分割列

sed

sed是一种流编辑器,一次处理一行内容,处理时,把当前处理行进行临时缓存,称为模式空间,接着sed命令处理缓存区内容,处理完成输出,不对文件内容改变

1.基本语法

sed [选项参数] ‘command’ filename

参数

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

命令功能描述

  • a 新增,a后面接字符,在下一行出现
  • d 删除
  • s 查找并替换

g表示全局

awk

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

1.基本语法

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

pattern:awk查找的内容,匹配模式

关键字

  • BEGIN开头

  • END结尾

action:执行命令

参数

-F指定分隔符

-v 赋值一个用户定义变量

example

1
2
3
4
#匹配passwd中root开头行取第七列

cp /etc/passwd /shell/
awk -F : '/^root/ {print $7}' passwd

内置变量

FILENAME 文件名

NR 已读记录数

NF 浏览记录的域的个数(切割后列的个数)

sort

进行排序并将结果输出

1.基本语法

sort(选项)(参数)

​ -n 按数值大小排序

​ -r 按相反顺序排序

​ -t 设置排序时的分隔符

​ -k 指定需要排序的列

example

1
cat sum1.txt | sort -t "" -nr