36.Linux中Shell脚本,高阶命令

Shell脚本

1. 简介

Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive)。

Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一 个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,包括循环和分支。但Shell脚本是解释执行的,不需 要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一 行敲到Shell提示符下执行。作为程序设计语言,它虽然不是 Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。

shell执行脚本是一门解释性语言、批量化处理语言,大大的节省了工作成本

shell脚本第一行必须以 #!开头,它表示该脚本使用后面的解释器解释执行变量

如:#! /bin/bash

1.1定义变量

myName=”小白”

String myName=”小白”

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。 同时,变量名的命名须遵循如下规则:

· 首个字符必须为字母(a-z,A-Z)。

· 中间不能有空格,可以使用下划线(_)。

· 不能使用标点符号。

使用变量:$变量名 为了区分,我们可以使用${变量名}

1.2删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用。

实例:

#!/bin/bash

myUrl="http://www.baidu.com"

unset myUrl

echo $myUrl

2.Shell 字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号

str='this is a string' 原样输出

单引号字符串的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

双引号

your_name='qinjx'

str="Hello, I know your are "$your_name"!" 转义符

双引号的优点:

双引号里可以有变量

双引号里可以出现转义字符

3.运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举例
+ 加法 expr $a + $b 结果为 30。,可以是数值型字符串
- 减法 expr $a - $b 结果为 -10。
* 乘法 expr $a \* $b 结果为 200。
/ 除法 expr $b / $a 结果为 2。
% 取余 expr $b % $a 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
-gt 相当于> [ $a -gt $b ] 返回 false
-lt 相当于小于 [ $a -lt $b ] 返回 true
! [ !true ] 返回false
-o 或 or [ true -o false ] 返回true
-a 与 and [ true -a false ] 返回false
-ge 大于等于  
-le 小于等于

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

运算符除了使用expr还可以通过这种方式

#!bin/bash

a=10

b=20

echo $((($a+$b)*$a))

\#!/bin/bash

a=10

b=20

c=$(($a+$b))

echo $c

((d=$a+$b))

echo $d

f=`expr $a + $b`  (反引号)

echo $f

 

for循环

1.第一种

\#!bin/bash

for i in {1..10} 1到10

do

echo haha

done

2.第二种

for file in ``ls /etc``; do

echo $file

done

第三种

\#!bin/bash

for i in $(ls /test)

do

echo $i

done

4.第四种

\#!bin/bash

for((i=0;i<20;i++))

do

echo $i

done

5.while循环

举例:

\#!/bin/bash

sum=1

i=0

while(( i <= 2 ))

do

let "sum*=10"

let "i+=1"

done

echo "sum=$sum"

5.1 break、continue

与java用法相同

5.2 sleep

sleep 1 休眠一秒(默认单位是秒)

6.read 键盘录入

scanner

read命令接收标准输入(键盘)的输入,或其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。

1.读取键盘输入

#! /bin/bash

read -p 请输入第一个数字: first

read -p 请输入第二个数字: second

echo $(($first+$second))

3.读取文件里的内容

while read line

do

arr[$i]=$line

let i+=1

done < /test/a.txt

3.读取EOF之间的内容 远程登录会用到

while read line

do

echo $line

done << EOF

hehe

haha

EOF

7.数组

定义数组 list

方式1:arr=()

方式2: arr=(value1 value2 value3) (这种方式带值)

注意:往数组里添加值,数组的长度自动增长

获取数组的长度:${#arr[*]}

遍历数组

#!/bin/bash

arr=(value value1 value2)

arr[0]=arr[1]=2

arr[2]=3

arr[3]=4

for i in ${arr[*]}; do

echo $i

done

8.条件语句

1.if else

#!/bin/bash

a=1

b=2

if [ $a -gt $b ]

then

echo "a大于b"

else

echo "a小于b"

fi

2.if elif

#!/bin/bash

if [ 1 -gt 2 ];then

echo "1>2"

elif [ 2 -gt 1 ];then

echo "2>1"

else

echo "什么鬼"

fi

If [ -f fileName ]判断是否是文件file

If [ -d fileName ]判断是否是文件夹dir

9. Case in

printf "Input integer number: "

read num

case $num in

1)

echo "Monday"

;;

2)

echo "Tuesday"

;;

3)

echo "Wednesday"

;;

4)

echo "Thursday"

;;

5)

echo "Friday"

;;

6)

echo "Saturday"

;;

7)

echo "Sunday"

;;

*)

echo "error"

esac

10. 注释:

单行:#

多行:举例:

#!/bin/bash

:<<!

echo "hehe"

echo "aaaa"

!

echo "haha"

 

#!/bin/bash

: ' (:与’之间有空格)

echo "hehe"

echo "aaaa"

'

echo "haha"

11. $0,$1,$#,$?

$0 代表文件本身的名字,你输入的是什么就显示的什么

$1 代表第一个参数

$# 代表参数的个数

$? 上一条命令的返回值

假如上一条命令执行成功:返回 ture;否则 返回 false

0 代表成功

1 代表失败

例如:

12.Crontab

crontab linux定时任务

crontab [-u username] [-l|-e|-r]

参数:

-e: 编辑crontab 的工作内容;

-l: 查阅crontab的工作内容;

-r: 删除所有的crontab的工作内容,若仅要删除一项,请用-e去编辑;

-u: 只有root才能进行这个任务,也即帮其他用户新建/删除crontab工作调度。

 

特殊字符 代表意义

(星号) 代表任何时刻都接受的意思。举例来说,范例一内那个日、月、周都是,就代表着不论何月、何日的礼拜几的12:00都执行后续命令的意思。

,(逗号)

代表分隔时段的意思。举例来说,如果要执行的工作是3:00与6:00时,就会是:

 

0 3,6 * * * command

时间还是有五列,不过第二列是 3,6 ,代表3与6都适用

-(减号)

代表一段时间范围内,举例来说,8点到12点之间的每小时的20分都进行一项工作:

20 8-12 * * * command

 

仔细看到第二列变成8-12.代表 8,9,10,11,12 都适用的意思

/n(斜线)

那个n代表数字,即是每隔n单位间隔的意思,例如每五分钟进行一次,则:

 

*/5 * * * * command

用*与/5来搭配,也可以写成0-59/5,意思相同

几个例子:

1.每天早上6点

0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron 把任何输出都email到root的信箱了。

2.每两个小时

0 */2 * * * echo "Have a break now." >> /tmp/test.txt

3.晚上11点到早上8点之间每两个小时和早上八点

0 23-8/2,8 * * * echo "Have a good dream" >> /tmp/test.txt

4.每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * 1-3 command line

 

实现秒级执行任务:

*/1 * * * * sleep 3 && echo "goodmorning" >> /test/a.txt

*/1 * * * * sleep 6 && echo "goodmorning" >> /tess/a.txt

*/1 * * * * sleep 9 && echo "goodmorning" >> /test/a.txt

*/1 * * * * sleep 12 && echo "goodmorning" >> /test/a.txt

......

Linux中高阶命令

1. awk

cut 进阶 awk

awk有几个常用的参数。

-F 指定分隔符,并且使用正则表达式

$0 可以输出一行内容

$1 $3 ... 这些是根据指定分隔符,分别获取对应参数的。

NF 字段数量变量

NR 每行的记录号,多文件记录递增

需求:列出root目录下,每行长度等于9,并显示出文件或文件夹的名字。

-v定义变量 var=value

BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量

END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

需求:将root路径下,所有的文件和文件夹 写入到数组中,并遍历出来。

定义一个变量

arr[0]=”2019-04-13”

arr[1]=”4hw.sh”

if语句 == != > >= < <= && ||

; 多条命令使用分号分隔

2.sed

可以使用正则表达式

需求:我想修改find.txt文件夹中的usr改成user

参数:

-i 直接修改文件内容

-e 选项允许在同一行里执行多条命令

命令:

s 替换指定字符

d 删除,删除选择的行 [删除空白行,指定删除行]

g 表示行内全面替换 [可以使用/Ng从第N处开始替换]

sed -i(真正修改文本文件) 's(要修改字符串就得加上)/你想修改的内容/修改为什么内容/g(行内匹配到的全部修改)' path(你要 修改的文件路径)

替换字符串中的字符 命令s 用法

3. seq

seq一般做测试

seq快速创建多个文件夹或者文件

等宽输出

-f和-w不能同时使用

-f 格式化输出

创建多个文件夹或者文件。目的是为了方便测试或使用

-w 等宽输出

-s 使用指定的字符串分割数字,默认是\n

arr=(seq -s " " 10)

4. xargs

xargs命令,给其他命令传递参数的过滤器。
xargs的默认命令是echo,空格是默认定界符。
几个常用参数:
-n选项多行输出

-d 可以自定义一个定界符

-I 指定一个替换字符串{}

需求:将text03中所有以.txt结尾的文件复制到 /test02当中

Xargs结合find使用

 

需求:查找根目录下所有 .txt结尾的文件,并将文件中的内容写入到 指定文本

find / -type f -name “*.txt”|xargs -I {} cat {}

 


已有 0 条评论

    欢迎您,新朋友,感谢参与互动!