获取中...

-

Just a minute...

概念

啥叫shell脚本呢?其实就是一个批处理文件,里面写了许多的命令,只需要运行这个文件,就相当于一次执行了许多命令
shell脚本的后缀名是 .sh

一个最简单的shell示例

第一种书写shell脚本的方式

1
2
3
4
#就相当于常规命令的操作集合
ls
pwd
ls -lah /bin

如何执行它呢?

  • 将这个文件命名为: test.sh
  • 然后给它修改权限: chmod u=x test.sh
  • 然后执行: ./test.sh即可(之所以加 ./ 是为了加载执行该脚本所必须的环境变量)

    一般我们约定凡是自定义的脚本建议放到 /usr/local/sbin/ 目录下,这样做的目的是:一来可以更好地管理文档、二来以后接管你的管理员都知道自定义的脚本放在那里,方便维护

第二种书写shell脚本的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /bin/bash
# #!是表示该文件使用是bash语法,如果不设置该行,那么你的shell脚本就不能被执行;#表示注释
# In this script we will use variables
# Writen by util.you.com@gmail.com

d=`date`
echo "the script begin at $d"
echo "now we will sleep 2 seconds."

sleep 2
d1=`date`
# 定义变量的格式:变量名=`变量的值`
# 当在当前脚本中需要引用变量时,需要加上$符号即可
echo "the script end at $d1"

然后将该文件命名为 demo.sh【通常是以sh作为后缀的,只是习惯而已,没有sh也可以执行】
然后这样运行:

逻辑判断

if-else 的逻辑判断

  • 不带 else 的
1
2
3
4
5
6
7
8
9
10
#! /bin/bash

echo -n "请输入你的成绩: "
# read 命令表示从控制台读取内容,此处即是读取用户输入的数字并且赋值给变量 score
read score

if [ $score -lt 60 ]
then
echo "抱歉,你没有通过考试."
fi

执行结果如下:

  • 带有 else 的
1
2
3
4
5
6
7
8
9
10
11
12
#! /bin/bash

echo -n "请输入你的成绩: "
# read 命令表示从控制台读取内容,此处即是读取用户输入的数字并且赋值给变量 score
read score

if [ $score -lt 60 ]
then
echo "抱歉,你没有通过考试."
else
echo "恭喜你,顺利通过考试."
fi

执行结果如下:

  • 带有 elif 的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /bin/bash

echo -n "请输入你的成绩: "
# read 命令表示从控制台读取内容,此处即是读取用户输入的数字并且赋值给变量 score
read score

if [ $score -lt 60 ] # 调用变量通过 $ 符号
then
echo "抱歉,你没有通过考试."
elif [ $score -gt 60 ] && [ $score -lt 90 ]
then
echo "你的成绩属于中等水平"
elif [ $score -gt 90 ] && [ $score -lt 100 ] # 注意:[] 符号前后必须有空格,否则报错
then
echo "恭喜你,你的成绩属于优秀"
else
echo "抱歉,你的输入有误."
fi

执行结果如下:

case 逻辑判断

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

read -p "请输入一个整数: " n

a=`expr $n % 2` # 凡是需要调用到内置函数处理的都需要使用表达式引号 ``

case $a in
0)
echo "您输入的数字是偶数."
;;
*)
echo "您输入的数字是奇数."
;;
esac

执行结果如下:

循环

for 循环

1
2
3
4
5
#!/bin/bash

for i in `seq 1 5`; do # seq: 用于产生从某个数到另外一个数之间的所有整数
echo $i
done

执行结果如下:

while 循环

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

a=10 # 注意:a 后面不要有空格

while [ $a -ge 1 ]; do # 注意:[] 括号前后一定要有空格
echo "$a"
a=`expr $a - 1 ` # 注意:凡是使用到加减乘除等运算时,都需要使用 expr 表明此处需要运算符号
done

执行结果如下:

函数

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

echo "请输入两个整数,并使用空格隔开: "
read num1 num2

sum(){
a=`expr $num1 + $num2`
echo "$num1 + $num2 = $a"
}

sum $num1 $num2 # 注意:这里必须要调用sum函数,并且传入用户输入的两个参数

执行结果如下:

echo 的好玩点

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

echo "Hello World 1"
echo -n "Hello world" #不带换行
echo -e "\e[0;33;1mhello\e[0m world" #带颜色的玩法
echo -e "\e[0;33;4mhello\e[0m world" #带颜色+下划线
echo -e "\e[0;33;5mhello\e[0m world" #带颜色+闪烁

格式为 \e[背景色;前景色;高亮格式m

执行结果如下:

字符串操作

判断字符串是否为空

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

s=""
if [ -z ${s} ] #注意:这里的[ ]前后必须有空格隔开,这个格式是固定的,shell中格式很严格
then
echo "字符串为空"
fi

执行结果如下:

上述命令中使用了 -z 运算符来判断字符串是否为空(在下面的字符串图中可以查找到),在 linux 中还有许多其它的运算符,如下图所示:

  • 关于文件测试的运算符

  • 关于字符串比较的运算符

获取字符串的长度

使用 str 本身的方法

1
2
3
4
#! /bin/bash

str="abcdef"
echo "$str 字符串的长度是:${#str}"

执行结果如下:

使用 awk 的 length 方法

1
2
3
4
#! /bin/bash

str="abcdef"
echo ${str} | awk '{print length($0)}' # 这里的 $0 表示是第一个输入,此处即指 ${str}

执行结果如下:

备注:最好用 {} 来放置变量;也可以用 length($0) 来统计文件中每行的长度

使用 wc 的 -L 参数

1
2
3
4
#! /bin/bash

str="ABCDEF"
echo ${str} | wc -L

执行结果如下:

备注:-L 参数,对多行文件来说,表示打印最长行的长度!比如:cat /etc/passwd | wc -L 表示/etc/passwd文件最长行的长度;
对单行字符串而言,表示当前字符串的长度

使用 expr 的 length 方法

1
2
3
4
#!/bin/bash

str="ABCDEF"
expr length ${str}

执行结果如下:

使用 expr 的 .* 技巧

1
2
3
4
#!/bin/bash

str="abef"
expr $str : ".*"

执行结果如下:

备注:.* 代表任意字符,即用任意字符来匹配字符串,结果是几就代表字符串的长度是几

关于获取字符串长度的方法很多,这里只是举例了几个,如果没有您需要的还请翻阅其它资料

替换目标字符串

截取子字符串

操作的API

示例如下:

转义字符处理

关于整数的处理

关于逻辑处理

小技巧:&&|| 还可以用来拼接命令,达到按前一个命令成功与否来决定是否执行后一个命令的效果

示例如下:

文件名的获取

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

s="/root/test/dir/subdir/abc.txt"
echo ${s##*/} # abc.txt
echo ${s%/*} # /root/test/dir/subdir
echo ${s##*.} # txt

执行结果如下:

小技巧:

  • 1、获取文件名:${path##*/} (相当于basename命令的功能) ,path只是一个变量名称而已;
  • 2、获取目录名:${path%/*}(相当于dirname命令的功能);
  • 3、获取后缀名:${path##*.}

重定向

标准输入流、标准输出流、标准错误流

重定向一览表

把程序打印的内容输出到文件

1
2
3
4
5
#!/bin/bash

#以下两种方式都会将 `Hello World`写入到hello.txt中(若不存在则创建)
echo "Hello World" > hello.txt #hello.txt原有的内容将被覆盖
echo "你好哦" >> hello.txt #hello.txt原有内容后追加'Hello World'

执行结果如下:

重定向标准错误流(stderr)

把程序的错误信息输出到文件,例如文件路径中不存在+++这个文件:

1
2
3
4
5
#!/bin/bash

#以下两种方式都会将输出的错误信息输出到 'err.txt'中(若不存在则创建)
ls +++ 2> err.txt
ls +++ 2>> err.txt #err.txt原有内容后追加内容

执行结果如下:


可以看到已经将你操作 ls +++ 的错误成功地输出到 err.txt 中了

查看当前目录大小

1
2
3
4
#! /bin/bash

cap=`du -h --max-depth=1 ./`
echo $cap

执行结果如下:

相关文章
评论
分享
  • ubuntu 安装 redis

    redis是什么Redis是常用基于内存的Key-Value数据库,比Memcache更先进,支持多种数据结构,高效,快速。用Redis可以很轻松解决高并发的数据访问问题 环境Ubuntu18.04 准备工作sudo apt upda...

    ubuntu 安装 redis
  • css基本样式设置

    div中文字居中如何让一个div中的文字水平和垂直居中?设置如下:给定该div的长宽(或者二者只给出其一也可) 123456.box{ height: 100px; width: 30%; text-align: cente...

    css基本样式设置
  • nginx在centos7下的安装

    nginx是什么Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 的服务Nginx 特点是占有内存少,并发能力强一般来说,如果我们在项目中引入了 Nginx ,我们的项目架构...

    nginx在centos7下的安装
  • spring boot程序的部署及运行

    将 spring boot 应用程序打包成 jar 包 我们使用 spring boot 的 maven 插件来构建管理整个应用程序,使用 mvn package 将应用程序打包成一个 jar 包 将 该 jar 包上传到 服务器 上...

    spring boot程序的部署及运行
  • Java 中 IO 操作总结

    java IO 操作分析直接看代码吧 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535...

    Java 中 IO 操作总结