Summary:总结

echo输出的三种情况:(这几种情况固然很难区分,那么就每种情况记忆1个好了!标红的是)

  • 和输出变量相关:(name=zhangsan) (大-括号)
    • echo $name ==>输出name变量的值
    • echo ${name}123 ==> 输出zhangsan123 (细节:如果只有变量名,大括号可以不写)
  • 和数学运算相关(中-括号)
    • echo $((5+5)) ==>输出10
    • echo $[5+5]
    • echo `expr 5+5’
  • 和执行Linux命令相关(小-括号)
    • echo `linux命令` ==> echo `pwd`
    • echo (Linux命令) ==> echo (ll -h)

开始前的准备

修改Linux中默认制表符

  • linux中默认制表符即Tab键为8个空格,在shell编程中略有不便
1
2
vim /etc/vim/vimrc  # 编辑系统中的文件
# 最后在末尾加入 set ts=4

Linux中的上传和下载

  • 方式一,直接拖拽文件到CRT中,但是tabby不能直接拖拽
  • 方式二,使用SFTP 协议,tabby点击右上角的sftp,
  • 方式三,secureCRT可以使用 rz 和 sz 命令完成文件的上传和下载
    • 如果 linux上没有这两个命令工具,则需要先安装。可以使用 yum 安装。
1
2
# 安装方式
yum -y install lrzsz

Mac(本机)查看下载文件的存储位置

  • 中文版目录设置:

点开 secureCRT 的菜单项中的【选项】 –> 会话选项 –> 打开会话选项对话框 –>点击分类中的的终端 –> X/Y/Zmodem

  • 英文版目录设置:

​ Options –> session options –> terminal –> X/Y/Zmodem,点开之后即可找到上传下载的目录位置

Linux中的环境变量

  • 为什么要配置环境变量
    • 安装JDK,MySQL等外部软件需要
    • Linux中的环境变量指的是Path环境变量, 配置它的目的是: 为了让在任意的路径下, 都能使用配置后的内容
    • 举例:把 /usr/bin 目录配置到了Path环境变量中, 则 /usr/bin/所有的命令 在任意的地方均可使用
  • 如何手动配置环境变量?
    • export 变量名=变量值(临时)
    • 下面修改配置文件就是永久的
1
2
vim /etc/profile  # linux的环境变量都是在这里配置的
source /etc/profile # 刷新文件,刷新之后立即生效

压缩和解压缩

a

1
2
3
4
5
6
7
8
9
# 这种方式压缩的文件windows也能使用
zip -r 压缩包名 要压缩的文件或者文件目录
unzip 压缩包名.zip -d 解压后的目录

tar -zcvf 要压缩的文件名
tar -zxvf 压缩包名 # 使用最多的压缩方式,x是解压缩

tar -cvf 要压缩的文件 # 创建压缩文件 c是创建的意思v是显示过程
tar -xvf 压缩包的名称

shell解释器

shell解释器是什么:简单的说shell解释器就是将用户写的shell编程装换为计算机可以识别的二进制代码,跟Python解释器差不多。

1
2
echo $shell     # 查看Linux中默认的shell解析器
cat /etc/shell # 查看所有的shell解释器

执行Shell脚本的四种方式

1
2
3
4
sh 脚本名称  		 # 不需要用户对脚本具有执行权,官方推荐
source 脚本名称 # source也可以刷新文件,不需要用户对脚本具有执行权
相对路径 # 需要用户对脚本具有执行权 ./1.sh
绝对路径 # 需要用户对脚本具有执行权 /root/1.sh

变量和参数

变量的定义和撤销

临时变量

1
2
3
hobby=sleep
export hobby=sleep # 这种方式也可以定义临时变量
unset hobby # 删除变量--即使不删除,重启服务器变量也会自动删除

撤销变量

1
unset hobby

只读变量

readonly name=lisi #设置name为只读变量,不可以修改,只能重启虚拟机才能删除

1
2
3
readonly name=lisi  # 设置name为只读变量
name=wangwu # 这里再修改变量会直接报错
unset name # 这里删除变量也会直接报错

参数的传递

$0 -->表示文件名,$# -->计算总的参数和,$* -->把参数显示出来,如1,2,3,$1 -->第一个参数,$n第n个参数

动态传参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!bin/bash
echo '故人西辞黄鹤楼,'
echo '烟花三月下扬州,'
echo '孤帆远影碧空尽,'
echo '唯见长江天际流。'

name='zhangsan'
echo 'my name is'$name

echo "文件名称:$0"
echo "传入的参数总个数为:$#"
echo "传入参数个数为:$*"
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "第三个参数为:$3"

# 在控制台输入1.sh 1 2 3 4 5 $#为5 $0 为1.sh $* 为1,2,3,4,5

echo输出

1
2
3
4
5
6
7
8
9
10
11
12
echo `pwd`  # 会输出pwd执行的结果 等价于echo $(pwd),也就是说``和$()一样
echo 'pwd' # 会直接输出pwd,等价于echo pwd

hobby=sleep
echo ${hobby} # 等价于echo $hobby # 输出变量

name='zhangsan' # 变量的定义推荐使用双引号,单引号会直接输出内容
echo my name is “$name” # 单引号包裹的$符号有特殊意义,单引号会直接输出

echo `expr 5+5` # expr = expression 输出10
echo $(( 5 + 5)) # 输出10
ech $[5 + 5] # 输出10

编写shell脚本

注意点

  • 1,在sh文件第一行写#!/bin/bash,下面的#就是注释
  • 2,双引号包裹的$有特殊意义, 单引号包裹则原样输出
  • 3,如果要执行Linux命令, 则: 用反引号包裹
  • 4,如果要执行Linux命令, 则: 用$()包裹

判断当前系统是否有多个ssh进程,如果有则打印true

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

if [ `ps -ef | grep -c "ssh"` -gt 0 ];then
echo "true"
fi # 别忘了if条件判断有个收尾

定义变量, 并在里边给变量赋值, 然后运行该Shell脚本

1
2
3
4
5
#!/bin/bash

num=2
echo $num # 等价于echo ${num}
echo ${num}

判断/media/cdrom目录是否存在,若不存在就去创建这个目录

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

# 编写test03.sh文件, 判断/media/cdrom目录是否存在,若不存在就去创建这个目录
dir="/media/cdrom"
# 判断该目录是否存在
if [ ! -d $dir ]
then
echo "不存在!正在创建."
echo `mkdir $dir`
echo "创建成功!"
else
echo "目录已经存在!"
fi

根据年龄判断是否成年

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

# 根据年龄判断是否成年

# 1,让用户从键盘中输入年龄,并用变量age接收
read -p "请输入您的年龄:" age

# 2, 判断年龄是否成年
if [ $age -ge 18 ];then # 这里可以使用test比如if test $age -ge 18, -ge是>=,-gt是>,-eq是=
echo "您已成年!"
else
echo "未成年!"
fi

求1-100的和(for

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 求1-100的和(for

sum=0
for ((i = 0; i<= 100; i++))
do
let sum=sum+i
done
echo $sum

输出1-5之间所有的整数, 通过while循环实现

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 输出1-5之间所有的整数, 通过while循环实现

i=1
while ((i < 5))
do
let i++
echo $i
done

求1-100的和 (while

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

# 求1-100的和 (while

i=0
sum=0
while ((i<101))
do
let sum=sum+i
let i++
done
echo $sum

演示死循环的三种写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

# 演示死循环的三种写法
# 写法一:
while :
do
echo "您已经进入死循环!"
done

# 写法二
while true
do
echo "您已经进入死循环!"
done

# 写法三
for ((;;))
do
echo "您已经进入死循环!"
done

打印1-10之间的数字

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 打印1-10之间的数字, 需求1: 遇到3结束. 需求2: 打印所有不是3的倍数的数字.
for ((i = 0; i <= 10; i++))
do
if [ $(($i % 3)) -eq 0 ];then
continue
else
echo $i
fi
done

判断两个变量是否相等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# 判断两个变量是否相等

# 让用户输入两个变量
read -p "请您输入第一个变量的值:" num1
read -p "请您输入第二个变量的值:" num2 # 这里的-p是采集用户输入的内容

if [ $num1 -eq $num2 ];then
echo "相等"
elif [ $num1 -gt $num2 ];then
echo "第一个变量大于第二个变量"
else
echo "第二个变量大于第一个变量"
fi

输入成绩,判断成绩"优秀, 良好, 中等, 需要更努力"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 输入成绩,判断成绩"优秀, 良好, 中等, 需要更努力" 
# 85-100:优秀, 70-84:良好, 60-69:中等, 0-59:需要更努力
read -p "请输入您的成绩" score # 录入成绩
while :
do
if [ $score -gt 100 ] || [ $score -lt 0 ];then
echo "没有这种成绩,请您重新录入:"
elif [ $score -gt 84 ];then # 成绩大于84即85
echo "优秀"
break
elif [ $score -gt 69 ];then
echo "良好"
break
elif [ $score -gt 59 ];then
echo "中等"
break
else
echo "需要更努力"
break
fi
done

顺序输出当前列表中的数字或者字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
# 顺序输出当前列表中的数字或者字符串.
# 列表: 1 2 3 4 5
# 列表: aa bb cc dd
for i in 1 2 3 4 5
do
echo $i
done

for i in aa bb cc dd
do
echo $i
done

打印/root目录下所有文件的名字

1
2
3
4
5
6
7
#!/bin/bash
# 打印/root目录下所有文件的名字

for i in `ls /root`
do
echo $i
done

猜数字的小游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
# Shell综合案例: 猜数字的小游戏
# 生成随机数
num=$[$RANDOM % 100 + 1]
while :
do
read -p "请输入您要猜的数字:" guess_num
if [ $num -eq $guess_num ];then
echo "恭喜您猜对了!"
break
elif [ $num -gt $guess_num ];then
echo "猜小了,接着猜"
else
echo "猜大了,接着猜"
fi
done

进阶试题

使用Linux命令查询file1中空行所在的行号

  • Linux中的空格:\r\n
  • Windows中的空格:\n
  • Mac中的空格:\r
1
awk '/^$/{print NR}' file1.txt

题目二

有文件chengji.txt内容如下:

张三 40

李四 50

王五 60

使用Linux命令计算第二列的和并输出

1
2
3
cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}'

# 结果150

Shell脚本里如何检查一个文件是否存在?如果不存在如何处理?

1
2
3
4
5
6
#!/bin/bash
if [ -f file.txt ]; then
echo "文件存在!"
else
echo "文件不存在!"
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   数字:
运算符 说明
-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否不相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。

字符串:
判断符 说明
-n STRING 字符串长度不为零
-z STRING 字符串长度为0
= 判断两个字符串是否一样
!= 判断两个字符串是否不一样

文件
判断符 说明
-f 存在且是普通文件
-d 存在且是目录
-h 存在且是符号链接
-e 文件存在
–r 文件存在并且可读
–w 文件存在并且可写
–x 文件存在并且可执行

对文本中无序的一列数字排序

1
2
3
[root@hadoop102   ~]# cat test.txt   # 1-10
[root@hadoop102 ~]# sort -n test.txt|awk '{a+=$0;print $0}END{print "SUM="a}'
SUM=55

查找当前文件夹(/home)下所有的文本文件内容中包含有字符”shen”的文件名称

1
2
3
[root@hadoop102 datas]$ grep -r "shen" /home | cut -d ":" -f 1
/home/root/datas/sed.txt
/home/root/datas/cut.txt