一、什么是shell

shell 是一个命令解释器


二、什么是shell脚本

清除/var/log/messages 日志文件内容的简单脚本命令

 

[root@cinder01 shell]# cat old_2.2.sh
#!/usr/bin/env bash

# 清除日志文件内容,版本1

cd /var/log

cat /dev/null > messages

echo "logs cleaned up."
[root@cinder01 shell]#

优化版:

 

[root@cinder01 shell]# cat old_2.3.sh
#!/usr/bin/env bash
# Version:v1.0

# 包含命令,变量和控制流的语句清除messages日志文件的shell脚本

LOG_DIR=/var/log

ROOT_UID=0  # UID为0的用户,即root用户

# 脚本需要使用root用户权限运行,因此,对当前用户进行判断,对不符合要求的用户发出友好提示,并且终断程序运行

if [ "$UID" -ne "$ROOT_UID" ] # 如果当前用户不是root用户,则不允许执行脚本
then
        echo "must be root to run this script." # 给出提示后退出
        exit 1
fi

# 如果却换目录不成功,则给出友好提示,并退出
cd $LOG_DIR || {
echo "cannot change to necessary directory."
exit 1
}

# 经过上面的判断,用户和目录都是正确的,下面判断情况messages文件内容,清除成功,则打印成功提示

cat /dev/null > messages && {
echo "Logs cleaned up."
exit 0  # 退出前返回0,0 表示成功,1表示失败
}
echo "Logs cleaned up fail."
exit 1


[root@cinder01 shell]#

查看系统支持的shell类型

 

[root@cinder01 shell]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/usr/bin/tmux
[root@cinder01 shell]#

两种方法查看系统默认的shell

 

[root@cinder01 shell]# echo $SHELL
/bin/bash
[root@cinder01 shell]#
[root@cinder01 shell]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@cinder01 shell]#

shell 脚本的建立和执行

在Linux系统中,默认使用 vi/vim 编写shell脚本

规范shell脚本


1. 脚本开头(第一行)

 

#!/usr/bin/env bash

指定shell解释器,"#!" 表示幻数,shell脚本在执行时,确定shell脚本运行的解释器(必须为脚本顶端的第一行)


2. bash 和 sh 的区别

sh 为 bash的软链接


3. 脚本注释

符号 "#" 表示单行注释

多行注释:

方法1:

:<<!

注释内容

!

方法2:

: '

注释内容 ,: 与 ' 之间带有空格

'

4. shell脚本的执行

[注:] "." 和 "source" 功能相同,都是读入脚本并执行脚本

5. shell 脚本的规范和习惯

1)  shell 脚本第一行指定脚本编辑器

 

#!/usr/bin/env bash
或:
#!/bin/bash

2) shell脚本开头加版本 版权等信息

 

# Author:xxx.xxx
# Time:2017-08-28 04:14:13
# Version:v1.0
# Description: This scripts function is ....

3) shell 脚本中尽量不使用中文,包括注释(防止中文乱码问题)

4) shell 脚本使用 .sh 为扩展名

5) shell 脚本存放在固定目录下


shell 脚本代码的书写习惯

1) 成对的符号尽量一次写完,然后退格在符号里面增加内容,防止遗漏

2) 中括号[] 两端至少要有1个空格

3) 控制流语句,应一次性将格式写完,再添加内容

4) 通过缩进让代码更易读

5) 对常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格

6) 脚本中的单引号,双引号及反引号必须为英文状态下的符号