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 # 删除变量--即使不删除,重启服务器变量也会自动删除
|
撤销变量
只读变量
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}
|
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
|