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 |
运算符除了使用expr还可以通过这种方式
#
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
5.2 sleep
sleep 1 休眠一秒(默认单位是秒)
6.read 键盘录入
scanner
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定时任务
参数:
-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.
cut 进阶 awk
awk有几个常用的参数。
$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 直接修改文件内容
命令:
s 替换指定字符
d 删除,删除选择的行 [删除空白行,指定删除行]
g 表示行内全面替换 [可以使用/Ng从第N处开始替换]
sed -i(真正修改文本文件) 's(要修改字符串就得加上)/你想修改的内容/修改为什么内容/g(行内匹配到的全部修改)' path(你要 修改的文件路径)
3. seq
seq一般做测试
seq快速创建多个文件夹或者文件
等宽输出
-f和-w不能同时使用
-f 格式化输出
创建多个文件夹或者文件。目的是为了方便测试或使用
-w 等宽输出
4. xargs
xargs命令,给其他命令传递参数的过滤器。
xargs的默认命令是echo,空格是默认定界符。
几个常用参数:
-n选项多行输出
-d 可以自定义一个定界符
-I 指定一个替换字符串{}
需求:将text03中所有以.txt结尾的文件复制到 /test02当中
Xargs结合find使用
需求:查找根目录下所有 .txt结尾的文件,并将文件中的内容写入到 指定文本
find / -type f -name “*.txt”|xargs -I {} cat {}
注意:本文归作者所有,未经作者允许,不得转载
