Shell脚本的语法

Posted LiuJun2Son

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本的语法相关的知识,希望对你有一定的参考价值。

Shell脚本的语法

Shell Script ,Shell脚本与Windows / Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务

1.一个简单的Shell脚本

1.新建一个 01-shell.sh 文件

下面的#!/usr/bin/bash 是指定该文件将使用bash命令解析器解析执行 。

其它写法:#!/usr/bin/env bash #!/bin/bash #!/bin/sh,它们之间的区别可以自行Google

#!/usr/bin/bash
echo 'hello world1'

echo hello world2

echo 'hello1' echo 'world1'

echo 'hello2' ; echo 'world2'

echo '---------1--------------'
mkdir /a/b/c  && echo 'ok....'
# 查看返回结果,返回 0 代表成功,非 0 代表失败
echo $?

echo '---------2--------------'
mkdir -p /usr/src/test  &&  echo '新建目录成功'
echo '上面指令返回值:'$?

echo '---------3--------------'
mkdir /usr/src/test  ||  echo '已经存在该目录'

2.在终端执行 bash 01-shell.sh 文件,并查看控制台输出

[root@ocr shell-sty]# bash 01-shell.sh 
hello world1
hello world2
hello1 echo world1
hello2
world2
---------1--------------
mkdir: cannot create directory ‘/a/b/c’: No such file or directory
1
---------2--------------
新建目录成功
上面指令执行的返回值: 0
---------3--------------
mkdir: cannot create directory ‘/usr/src/test’: File exists
已经存在该目录

2.Shell定义变量

1.新建一个 02-shell.sh 文件

#!/usr/bin/bash

# 定义变量
your_name="liujun"

# 使用变量
echo $your_name
echo $your_name


echo ---------1.双引号----------
# 使用双引号拼接
greeting="hello, "$your_name" !" # 正确
greeting_1="hello1, $your_name !" # 正确
echo $greeting  $greeting_1

echo ---------2.单引号----------
# 使用单引号拼接
greeting_2='hello2, '$your_name' !' # 正确
greeting_3='hello3, $your_name !'  # 错误
echo $greeting_2  $greeting_3

echo ---------3.数组----------
# 定义数组
array_name=(
liujun
rose
jack
llili
)
echo $array_name[0] # 取第一个
echo $array_name[@] # 取所有

2.在终端执行 bash 02-shell.sh 文件,并查看控制台输出

liujun
liujun

---------1.双引号----------
hello, liujun ! hello1, liujun !

---------2.单引号----------
hello2, liujun ! hello3, $your_name !

---------3.数组----------
liujun
liujun rose jack llili

3.接收执行命令传递的参数

1.新建一个 03-shell.sh 文件

#!/usr/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

2.在终端执行 bash 03-shell.sh 文件,并查看控制台输出

其中 1 2 a 是传递的参数,通过 $1 $2 $3

[root@ocr shell-sty]# bash 03-shell.sh 1  2  a

Shell 传递参数实例!
执行的文件名:03-shell.sh
第一个参数为:1
第二个参数为:2
第三个参数为:a

4.Shell 基本运算符

1.新建一个 04-shell.sh 文件

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

#!/usr/bin/bash

a=10
b=20

result1=`expr $a + $b`
echo "a + b : $result1"

result2=`expr $a - $b`
echo "a - b : $result2"

result3=`expr $a \\* $b`  # 注意乘法需要转译
echo "a * b : $result3"

result4=`expr $b / $a`
echo "b / a : $result4"

result5=`expr $b % $a`
echo "b % a : $result5"

2.在终端执行 bash 04-shell.sh 文件,并查看控制台输出

[root@ocr shell-sty]# bash 04-shell.sh
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0

5.Shell 流程控制

1.新建一个 05-shell.sh 文件

if 条件写在 [ ] 内

#!/usr/bin/bash

a=10
b=20

echo ---------1.if语句----------
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
   echo "xxxxxx"
   pwd # 往下还可以执行多个命令	
else
   echo "$a -eq $b: a 不等于 b"
fi

echo ---------2.if else 语句----------
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi

echo ---------3.if elif 语句----------
if [ $a == $b ]
then
   echo "a 等于 b"

elif [ $a -gt $b ]
then
   echo "a 大于 b"

elif [ $a -lt $b ]
then
   echo "a 小于 b"

else
   echo "没有符合的条件"
fi

echo ---------4.for 语句----------
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

echo ---------5.for 语句----------
for str in This is a string
do
    echo $str
done


2.在终端执行 bash 05-shell.sh 文件,并查看控制台输出

[root@ocr shell-sty]# bash 05-shell.sh

---------1.if语句----------
10 -eq 20: a 不等于 b

---------2.if else 语句----------
10 -ne 20: a 不等于 b

---------3.if elif 语句----------
a 小于 b

---------4.for 语句----------
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

---------5.for 语句----------
This
is
a
string

6.编写定时任务执行Shell脚本

在Linux下我们用 crontab( 定时任务) 来实现定期执行脚本。

1.查看 crontab 配置信息 输入命令:cat /etc/crontab

[root@ecs-s2-medium-2-linux-20190804173931 demo1]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed


2.查看 crontab 的命令

[root@ecs-s2-medium-2-linux-20190804173931 demo1]# crontab --h
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
usage:	crontab [-u user] file
	crontab [-u user] [ -e | -l | -r ]
		(default operation is replace, per 1003.2)
	-e	(edit user's crontab)
	-l	(list user's crontab)
	-r	(delete user's crontab)
	-i	(prompt before deleting user's crontab)
	-s	(selinux context)

3.查看当前用户所有的定时任务(crontab)

下面显示当前用户有一定时任务,默认是没有的

[root@ecs-s2-medium-2-linux-20190804173931 demo1]# crontab -l
*/1 * * * * bash /usr/local/test-shell/demo1/01-shell.sh

4.删除当前用户所有的定时任务(crontab)

删除定时任务后会自定停止该定时任务

[root@ecs-s2-medium-2-linux-20190804173931 demo1]# crontab -r

3.编辑当前用户所有的定时任务(crontab)

下面编写一个每分钟执行一次 01-shell.sh 脚本的定时任务。

[root@ecs-s2-medium-2-linux-20190804173931 demo1]# crontab -e
*/1 * * * * bash /usr/local/test-shell/demo1/01-shell.sh
~
~
~
~
~
~

执行crontab -e 会进入vi界面。
编写完后定时任务后 按键盘的 esc,之后在按ctrl + : 然后输入 wq , 确认保存退出,定时任务自动生效。

以上是关于Shell脚本的语法的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程语法及应用

SHELL脚本

shell脚本基础

shell脚本

Shell脚本编写1

Emacs shell 脚本 - 如何将初始选项放入脚本中?