一、Shell 脚本


一、Hello Shell

# 1、创建一个`HelloShell.sh文件`。
touch HelloShell.sh

# 2、编写脚本。
vim HelloShell.sh
------------------------------
#!/bin/bash
# This is ower first shell
# by author rivers 2022.06
echo "Hello Shell"
------------------------------

# 3、查看脚本。
cat HelloShell.sh
ll HelloShell.sh
#`-rw-r--r-- 1 root root 85 6月  28 20:24 HelloShell.sh`

# 4、赋予执行权限。
chmod o+x Helloword.sh 
ll HelloShell.sh 
#`-rw-r--r-x 1 root root 85 6月  28 20:24 HelloShell.sh`

# 5、运行脚本。
[root@qs shell]# ./HelloShell.sh  1 2 3
#`Hello Shell`

在这里插入图片描述


二、Shell 变量

  • Shell变量名 在定义时。
  1. 首个字符必须为字母开头(a-z、A-Z)。
  2. 不能以数字开头。
  3. 中间不能有空格。
  4. 可以使用下划线(_)。
  5. 不能使用(-)。
  6. 不能使用 标点符号 等。
# 等号左右不能有`空格`。
[root@qs shell]# age=18
[root@qs shell]# echo $age
#`18`

1. 系统变量

  • 主要是用于对 参数判断 和 命令返回值判断 时使用。
echo ---------- 系统变量 ----------
# 当前脚本的名称(间接运行时还包括绝对路径)。
echo '$0' = $0	
# `$n`传递给`脚本或函数`的`第n个参数`(`n=1 2 3 ...`)。
echo '$1' = $1
echo '$2' = ${2}

echo ------------------------------
# 传递给`脚本或函数`的`参数个数`(不包括程序本身)。
echo '$#' = $#	
# 传递给`脚本或函数`的`所有参数`(不包括程序本身)。
echo '$*' = $*	
echo '$@' = $@
# 被双引号(" ")包含时,与`$*`不同。
echo '$*' = 
for var in "$*"
do
	echo ${var}
done
echo '$@' =
for var in "$@"
do
	echo ${var}
done
# 上一条命令的`最后一个参数`。
echo '$_' = $_    

echo ------------------------------
# `命令、程序或函数`执行完后的状态(或返回值)(返回`0表示执行成功`、`1表示执行失败`)。
echo '$?' = $?	
# 当前`Shell程序`的进程号(`PID号`)。
echo '$$' = $$	
# 后台运行的`最后一个进程号`。
echo '$!' = $!   

  • /root/test/shell/ShellTest.sh 1 2 3
    在这里插入图片描述

2. 环境变量

  • 主要是在 程序运行时 需要设置。
echo ---------- 系统变量 ----------
# 所示路径,以`冒号分割`。
echo 'PATH' = $PATH		
# 打印`用户家目录`。
echo 'HOME' = $HOME   		
# 显示`当前Shell类型`。
echo 'SHELL' = $SHELL 
# 打印`当前用户名`。		
echo 'USER' = $USER  	
# 打印`当前用户ID`信息。	
echo 'ID' = $ID    		    
# 显示`当前所在路径`。
echo 'PWD' = $PWD   		    
# 打印`当前终端类型`。
echo 'TERM' = $TERM  		
# 显示`当前主机名`。
echo 'HOSTNAME' = $HOSTNAME  
# 定义主机命令提示符的。
echo 'PS1' = $PS1      
# 历史命令大小,可通过`HISTTIMEFORMAT变量`设置命令执行时间。      
echo 'HISTSIZE' = $HISTSIZE  
# 随机生成一个`0至32767`的整数。
echo 'RANDOM' = $RANDOM       

在这里插入图片描述


3. 用户变量

  • 用户变量 又称为 局部变量,主要用在 Shell脚本内部 或者 临时局部 使用。
echo ---------- 用户变量 ----------
# 自定义`变量a`。
a=rivers
echo 'a' = $a
# 自定义`变量httpd_sort`。
httpd_sort=httpd-2.4.6-97.tar
echo 'Httpd_sort' = $httpd_sort
# 自定义`变量BACK_DIR`。
BACK_DIR=/data/backup/
echo 'BACK_DIR' = $BACK_DIR
# 自定义`变量IP_ADDRESS`。
IP_ADDRESS=10.0.0.1
echo 'IP_ADDRESS' = $IP_ADDRESS

在这里插入图片描述


三、颜色背景色

echo ---------- 字体颜色 ----------
# 字体颜色
for i in {31..37}; do
echo -e "\033[$i;40mHello Shell!\033[0m"
done
# 背景颜色
for i in {41..47}; do
echo -e "\033[47;${i}mHello World!\033[0m"
done
# 显示方式
for i in {1..8}; do
echo -e "\033[$i;31;40mHello Java!\033[0m"
done

在这里插入图片描述


四、流程控制语句


1. If 条件判断语句

  • If 条件判断语句,通常以 if开头,fi结尾。
  • 也可加入 else 或 elif 进行多条件的判断。

echo ---------- If 条件判断语句 ----------
# 单分支`if语句`
if [ -f /etc/passwd ]
then 
	echo ok
fi

if [ 10 -eq 10 ]
then
  	echo ok
fi

#if [ "root" =~ ^r ]
#then
#   echo ok
#fi


# 双分支`if语句`
if [ 10 -eq 10 ]
then
	echo 成立
else
   	echo 不成立
fi


# 多支条件语句
if [ $1 -lt 20 ]
then
	echo 小了
elif [ $1 -gt 20 ]
then
	echo 大了
else
	echo 相等
fi

在这里插入图片描述


1.1 if 判断逻辑运算符
-f	 	# 判断文件是否存在`eg: if [ -f filename ]`。
-d	 	# 判断目录是否存在`eg: if [ -d dir ]`。
-eq		# 等于,应用于整型比较`equal`。
-ne		# 不等于,应用于整型比较`not equal`。
-lt		# 小于,应用于整型比较`letter`。
-gt		# 大于,应用于整型比较`greater`。
-le		# 小于或等于,应用于整型比较。
-ge 	# 大于或等于,应用于整型比较。
-a		# 双方都成立(and)逻辑表达式`–a`。
-o		# 单方成立(or)逻辑表达式`–o`。
-z		# 空字符串。
-x      # 是否具有可执行权限。
||      # 单方成立。
&&      # 双方都成立表达式。

1.2 if 案例——单分支语句——判断 crond 进程是否在运行
echo ---------- if 案例——单分支语句——判断`crond`进程是否在运行 ----------
# 定义一个变量名
name=crond
num=$(ps -ef | grep $name | grep -vc grep)
if [ $num -eq 1 ];then
	echo "$num running!"
else
	echo "$num is not running!"
fi

在这里插入图片描述


1.3 if 案例——单分支语句——判断系统目录是否存在
echo ---------- if 案例——单分支语句——判断系统目录是否存在 ----------
if [ -d /root/test -o -d /root/demo ];then
	mkdir -p /root/demo 
fi

1.4 if 案例——多分支语句——判断学生分数等级
echo ---------- if 案例——多分支语句——判断学生分数等级 ----------
# `if语句`可以直接对命令状态进行判断,就省去了获取`$?`这一步。
# 如果第一个条件符合,就不再向下匹配。  
grade=$1
if [ $grade -gt 90 ];then
	echo "Is's very good!"
elif [ $grade -gt 70 ];then
	echo "Is's is good!"
elif [ $grade -ge 60 ];then
	echo "pass"
else
	echo "no pass"
fi

在这里插入图片描述


2. for 循环语句

# `for循环`格式。
# for name [ [in [word ... ] ] ;] do list; done
for '变量名' in '取值列表'; do
	'语句1'
done

2.1 for 案例——检查同一局域网内,多个主机是否存活
echo ---------- for 案例—检查同一局域网内,多台主机是否存活 ----------
Network=$1
for Host in $(seq 1 254)
do
ping -c 1 $Network.$Host > /dev/null && result=0 || result=1

if [ "$result" == 0 ];then
	echo -e "\033[32;1m$Network.$Host is up \033[0m"
	echo "$Network.$Host" >> /tmp/up.txt
else
	echo -e "\033[;31m$Network.$Host is down \033[0m"
  	echo "$Network.$Host" >> /tmp/down.txt
fi
done

./ping.sh 127.0.0.1

在这里插入图片描述


3. while 循环语句

# 1、`while循环`与`for循环`功能类似,主要用于 对某个数据域进行循环读取、对文件进行遍历。
# 2、通常用于需要循环某个文件或列表,满足循环条件会一直循环,不满足则退出循环。
# 3、其语法格式以`while ... do`开头,`done`结尾。
# - 与while关联的还有一个`until语句`,它与while不同之处在于,是当条件表达式为`false`时才循环,实际使用中比较少。

while ('表达式')
do
	'语句1'
done

3.1 while 循环——break 和 continue 语句
# 1、break:是终止循环。
# 2、continue:是跳出当前循环。
echo ---------- while 案例—在死循环中,满足条件终止循环 ----------
while true; do
	let N++
  	if [ $N -eq 5 ]; then
		break
	fi
  	echo $N
done


echo ---------- while 案例—continue ----------
N=0
while [ $N -lt 5 ]; do
	let N++
	if [ $N -eq 3 ]; then
  		continue
	fi
  	echo $N
done


echo ---------- while 案例—打印1-5数字 ----------
i=0
while ((i<=5))
do
	echo  $i
  	i=`expr $i + 1`
done

在这里插入图片描述


3.2 while 案例——循环求1-100的总和
echo ---------- while 案例—循环求1-100的总和 ----------
j=0
i=1
while ((i<=100))
do
	j=`expr $i + $j`
    	((i++))
done
echo $j

在这里插入图片描述


3.3 while 案例——循环每 10 秒判断系统登录
echo ---------- while 案例——循环每`10`秒判断系统登录 ----------
# `root用户`是否登录系统。
USERS="qs"
while true
do
	echo "The Time is `date +%F-%T`"
	sleep 10
	NUM=`who|grep "$USERS"|wc -l`
	if [[ $NUM -ge 1 ]];then
	      echo "The $USERS is login in system."
	fi
done

在这里插入图片描述


4. case 选择语句

# 1、case选择语句,主要用于对多个选择条件进行匹配输出。
# 2、与`if elif语句`结构类似,通常用于脚本 传递输入参数,打印出输出结果及内容。
# 3、其语法格式以`case ... in`开头,`esac`结尾。
case '模式名' in
'模式1')
	'命令'
    ;;
'模式2')
   	'命令'
   	;;
*)
	'不符合以上模式,执行的命令'
esac
# 每个模式必须`以右括号结束`,命令结尾`以双分号结束`。

4.1 case 案例——编写 http 服务启动脚本
echo ---------- case 案例——编写`http`服务启动脚本 ----------
while true;
do
	echo -e "
    \033[31m start \033[0m
    \033[32m stop \033[0m 
    \033[33m status \033[0m
    \033[34m quit \033[0m 
"

read -p "请输入您的选择 [start|stop|quit]:" char

case $char in
start)
	systemctl start httpd && echo "httpd服务已经开启" || echo "开启失败"
;;
stop)
   	systemctl stop httpd && echo "httpd服务已经关闭" || echo "关闭失败"
;;
restart)
   	systemctl restart httpd && echo "httpd服务已经重启" || echo "重启失败"
;;
status)
  	systemctl status httpd && echo -e "httpd服务状态"
;;
quit)
	echo -e "httpd服务退出"
;;
*)
	echo -e "httpd服务"
;;
esac
done

在这里插入图片描述


5. select 选择语句

# 1、`select语句`是一个类似于`for循环`的语句。
# 2、`select语句`一般用于选择,常用于选择菜单的创建。
# 3、可以配合`PS3`,来做打印菜单的输出信息。
# 4、其语法格式以`select ... in do`开头,`done`结尾。

select i in ('表达式') 
do
	'语句'
done

5.1 select 案例——选择 MySQL 版本
echo ---------- select 案例——选择MySQL版本 ----------
PS3="Select a number: "
while true; do
	select mysql_version in 5.1 5.6 quit;
 	do
  		case $mysql_version in
  		5.1)
    		echo "mysql 5.1"
      		break
      		;;
  		5.6)
    		echo "mysql 5.6"
       		break
       		;;
  		quit)
    		exit
    		;;
  		*)
    		echo "Input error, Please enter again!"
      		break
		esac
 	done
done

在这里插入图片描述


5.2 select 案例——打印 lnmp 菜单栏
echo ---------- select 案例——打印`lnmp`菜单栏 ----------
PS3="Please enter you select install menu: "
select i in http php mysql quit
do
	case $i in
		http)
        echo -e "\033[31m Test Httpd \033[0m" 
        ;;
        php)
        echo  -e "\033[32m Test PHP\033[0m"
        ;;
        mysql)
        echo -e "\033[33m Test MySQL.\033[0m"
        ;;
        quit)
        echo -e "\033[32m The System exit.\033[0m"
        exit
	esac
done

在这里插入图片描述


6. getopts 参数解析

# 语法格式。
getopts ['option'[:]] ['DESCPRITION'] 'VARIABLE'
# [option[:]] 
'option'	# 表示为某个脚本可以使用的选项。
':'			# 如果某个选项(option)后面出现了冒号(':'),则表示这个选项后面可以接参数(即一段描述信息'DESCPRITION')。
'VARIABLE'	# 表示将某个选项保存在`变量VARIABLE`中。

6.1 getopts 案例——参数解析
echo ---------- getopts 案例—参数解析 ----------
while getopts ":a:b:c:" opt
do
	case $opt in
  	a)
   		echo "参数a = $OPTARG"
       	;;
	b)
		echo "参数b = $OPTARG"
		;;
	c)
		echo "参数c = $OPTARG"
		;;
	?)
		echo "未知参数 = $OPTARG"
		exit 1
		;;
 	:)
      	echo "没有输入任何参数 = $OPTARG"
  	;;
	esac 
done
  • ./ShellTest.sh -a 1 -b=2 -c3 -d
    在这里插入图片描述

6.2 case 案例——参数解析
echo ---------- case 案例—参数解析 ----------
#!/bin/sh

declare -i win_count=0
declare -i lin_count=0
  
function help() {
	echo -e "\033[36;1mhelp:\033[0m"
    echo -e "\033[36;1m    --win(-W) :   Windows Number of Windows VMS(eg: -W 2 or --win 2)\033[0m"
    echo -e "\033[36;1m    --Lin(-L) :   Linux Number of Linux VMS(eg: -L 2 or --lin 2)\033[0m"
    echo -e "\033[36;1m    --help(-h):   display this help and exit \033[0m"
}
 
function isLegal() {
    machine_num=$1
    if [ $machine_num -eq 0 ]; then
        echo "[-] Parameters of illegal !!"
        help
        exit 1
    fi
}
 
if [[ $1 = "--help" ]] || [[ $1 = "-h" ]]; then                                                                                                          
    help
    exit 1
fi
 
if [ ! -n "$1" ]; then
    echo "[-] Parameters of illegal !"
    help
    exit 1
fi
 
while [ -n "$1" ]
do
    case "$1" in
        --win) win_count=$2
            shift
            ;;
        -W) win_count=$2
            shift
            ;;
        --lin) lin_count=$2
            shift
            ;;
        -L) lin_count=$2
            shift
            ;;
        *) echo "[-] Parameters of illegal !!!"
            help
            exit 1
            ;;
    esac
    shift
done
 
isLegal $win_count
isLegal $lin_count
 
echo $win_count --- $lin_count

在这里插入图片描述


五、函数 和 数组


1. 函数

# 1、Shell 允许将一组 命令集 或 语句 形成一个可用块,这些块称为 Shell函数。
# 2、Shell函数 的用于只需定义一次,后期随时使用即可,无需在 Shell脚本 中添加重复的语句块。
# 3、其语法格式以`function name() {`开头,以`}`结尾。

# 4、Shell编程函数 默认不能将参数传入`()`内部。
# 5、Shell函数参数 传递在调用函数名称传递,例如`name args1 args2`。

# Shell函数 很简单,函数名后跟双括号,再跟双大括号。
func() {
	command1
	command1
	...
}

# 通过`函数名`直接调用,不加小括号。
func

1.1 案例——无参函数
echo ---------- 案例——无参函数 ----------
func() {
	VAR=$((1+1))
	return $VAR
	echo "This is a function."
}

func
echo $?

在这里插入图片描述


1.2 案例——有参函数
echo ---------- 案例——有参函数 ----------
test() {
	echo "Parameter #1 is $1"
}
test 20


test2() {
    echo hello $name
}
name="tom"
test2

1.3 案例——Apache 软件安装
echo ---------- 案例——`Apache`软件安装 ----------
# Httpd define path variable
FILES=httpd-2.2.31.tar.bz2
LES_DIR=httpd-2.2.31
URL=http://mirrors.cnnic.cn/apache/httpd/
PREFIX=/usr/local/apache2/
function Apache_install () {
	# Install httpd web server 
	if [[ "$1" -eq "1" ]];then
		wget -c $URL/$FILES &&  tar -jxvf $FILES && cd $FILES_DIR &&./configure
        if [ $? -eq 0 ];then
       		make && make install
           		echo -e "\n\033[32m--------------------------------------------
                echo -e "\033[32mThe $FILES_DIR Server Install Success !\033[0m
        else
                echo -e "\033[32mThe $FILES_DIR Make or Make install ERROR,Plea
                exit 0
        fi
	fi
}

# 调用函数,传参为1
Apache_install 1

2. 数组

# 1、数组 是相同类型的元素,按一定顺序排列的集合。
# 2、格式:`array=(元素1 元素2 元素3 ...)

# 3、用小括号初始化数组,元素之间用空格分隔。
# 3.1、定义方法一:初始化数组`array=(a b c)`。
# 3.2、定义方法二:新建数组并添加元素`array[下标]=元素`。
# 3.3、定义方法三:将命令输出作为数组元素`array=($(command))`。

2.1 案例——遍历数组元素一
echo ---------- 数组案例——遍历数组元素一 ----------
# 方法一
IP=(10.0.0.1 10.0.0.2 10.0.0.3)
for ((i=0; i<${#IP[*]}; i++)); do
	echo ${IP[$i]}
done

在这里插入图片描述


2.2 案例——遍历数组元素二
echo ---------- 数组案例——遍历数组元素二 ----------
# 方法二
IP=(10.0.0.1 10.0.0.2 10.0.0.3)
for IP in ${IP[*]}; do
	echo $IP
done 

在这里插入图片描述


  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑士梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值