转载

Shell编程

  • 定义变量: name="陈加兵"
  • 撤销变量: unset name
  • 声明静态变量: readonly name="陈加兵"
    • 静态变量不能 unset ,否则报错
  • 使用变量: ${}或者$变量
    • echo "姓名:${name}" 或者 echo "姓名:$name"
  • 系统环境变量: export A="陈加兵"
    vim /etc/profile
    source /etc/profile
    $name
    

位置参数变量

  • 基本语法:
    $n
    $*
    $@
    $#
    

$*与$@的区别

  • $*$@ 都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数
  • 当它们被双引号“”包含时, $* 会将所有的参数作为一个整体,以“$1 $2 …$n”的形 式输出所有参数; “$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个 for 循环只会循环一次
do
echo "The parameters is: $i"
done
x=1
for y in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "The parameter$x is: $y"
x=$(( $x +1 ))
done

实例

  • 输出输入的的参数 1,参数 2,所有参数,参数个数,其中的脚本 first.shell 如下
#!/bin/bash
# 输出命令本身和前两个参数
echo "$0 $1 $2"
# 输出所有的参数,不包含命令本身
echo "$*"
# 输出所有的参数,不包含命令本身
echo "$@"
#输出参数的个数,不包含命令本身
echo "$#"
  • 执行该脚本 ./first.shell 1 2

预定义变量

  • $? :最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行,如果这个变量的值为非0(具体哪个值是由命令自己决定),则证明上一个命令执行不正确了.
    • 这样如果需要判断上一个执行的状态才能进行下一步的操作,那么只需要判断这个是是否为0即可
  • $$ :输出当前进行的进程Id(PID)
  • $! :后台运行的最后一个进程的PID
#!/bin/bash
echo "$$"
./helloworld.sh &
echo "$!"
echo "$?

运算符

基本语法

  • "$((运算式))"或"$[运算式]"
    echo "$((1+2))"
    echo "$[1+2]"
    
  • expr m + n :其中这个表达式需要用单引号括起来才能执行
    • 注意 expr 运算符间要有空格 ,即是m,n和运算符 + 要有空格
    • expr /*, /, % 乘,除,取余 ,注意其中的乘需要转义,否则不能参与运算

实例

A=$[(1+2)*4*4]
echo "${A}"
unset A

判断语句

基本语法

  • [ condition ]注意 condition 前后要有空格

常用判断条件

  • 两个整数之间比较
    =
    -lt
    -le
    -eq
    -gt
    -ge
    -ne
    
  • 按照文件权限比较
    -r
    -w
    -x
    
  • 按照文件类型进行判断
    -f
    -e
    -d
    

实例

[ 23 -ge 22 ]
[ -w student.txt ]
[ -e /root/install.log ]

流程控制

if

基本语法

if [ 条件判断式 ];then
程序
fi

# 或者
if [ 条件判断式 ]
then
程序
fi

实例

  • if-else
if [ -e /usr/local/shell/five.shell ] 
 then 
        echo "陈加兵" 
fi
  • if-elseif-els
#!/bin/bash

A=$[(1+2)*4]

if [ ${A} -gt 10 ]
then
        echo "${A}大于10"
elif [ ${A} -lt 10 ]
then
        echo "${A}小于10"
else
        echo "${A}等于10"
fi

case

基本语法

case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

实例

#!/bin/bash

# 获取控制台输入的第一个参数,不是命令本身
A=$1

case ${A} in

"1")
        echo "1"

;;

"2")
        echo "2"
;;

"3")
        echo "3"
;;
##结束标记
esac

for循环

基本语法

  • 语法一
for 变量 in 值 1 值 2 值 3…
do
程序
done
  • 语法二
    • 双括号
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done

实例

#!/bin/bash

# 接受控制台输入的值并且循环输出
for i in "$*"
        do
                echo "The num is ${i}"
        done

for j in "$@"
        do
                echo "The num is $j"
        done
sum=0;
# 这里的for循环一定要加双括号
for((i=1;i<=100;i++)) 
        do
                sum=$[$i+$sum]
        done
echo "从1加到100的和为:$sum"

while循环

基本语法

while [ 条件判断式 ]
do
程序
done

实例

#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
	do 
		sum=$[$i+$sum]
		i=$[$i+1]
	done

echo "从1加到100的值为:$sum"

read读取控制台输入

基本语法

  • read [选项][参数]
    -p
    -t
    

实例

#!/bin/bash

read -t 7 -p "请在控制台输入数字,等待时间7秒:" NUM

echo "用户输入的数字为:$NUM"

函数

系统函数

  • 系统函数是系统自带的一些函数,只需要直接调用即可,不需要自己调用
  • basename :去掉文件的路径,直接输出文件的名称
    • basename /usr/local/shell/first.shell :直接输出first.shell
    • basename /usr/local/shell/first.shell .shell :直接输出 first ,去掉了文件的后缀 .shell
  • dirname :去掉文件的名称,直接输出文件的路径
    • dirname /usr/local/first.shell :直接输出 /usr/local/

自定义函数

  • 格式:
[ function ] funname[()]
{
Action;
[return int;]
}

# d调用
funname
  • 实例
#!/bin/bash
function sum()
{
    sum=0;
    sum=$[$1+$2]
    echo "两数之和为:$sum"
}

## 读取控制台输入的数字
read -p "输入第一个数:" n1
read -p "输入第二个数" n2

## 调用函数
sum $n1 $n2

定时任务调度 crond

自动安装Nginx

  • 本人写了一个自动安装Nginx的脚本,适合Centos的安装,亲测有用, 点击下载
#!/bin/bash
## NGINX安装的路径
NGINX_PATH=/usr/local/myNginx/

## 自动安装Nginx的函数
function install_nginx()
{	
	## 创建目录,如果文件夹不存在,那么需要新建文件夹
	if [ -d $NGINX_PATH ]
		then
		echo "文件件已经存在,开始安装"
	else
		mkdir -p $NGINX_PATH
	fi
	
	## 切换到安装目录
	cd $NGINX_PATH
	
	## 下载Nginx的压缩包,因为网络不稳定,因此需要开启无限循环下载
	while [ true ]
		do
			wget http://nginx.org/download/nginx-1.12.2.tar.gz
			
			## 判断下载命令是否执行成功,下载失败之后直接中断脚本的运行
			if [ $? -eq 0 ]
				then
					echo "=======================文件下载成功,现在开始解压文件了==========================="
					tar -zvxf nginx-1.12.2.tar.gz
					## 解压缩成功,那么需要删除这个压缩包了
					rm -f nginx-1.12.2.tar.gz
					#文件下载成功当然可以跳出循环了,执行下面的步骤
					break
			fi

		done
	

	## 安装依赖
	yum -y install pcre*
	yum -y install openssl*

	## 进入解压缩的文件目录
	cd nginx-1.12.2
	
	## 执行安装的命令
	./configure

	## 判断上面的命令执行是否成功,如果执行失败需要安装对应的依赖才能编译
	if [ !$? -eq 0 ]
		then
			echo "==========================执行./configure这个命令失败,开始安装对应的依赖了========================================"
			 yum -y install gcc make gcc-c++ openssl-devel
			
	fi

	## 此时到了这里,肯定是可以编译了
	make install
	# 检测上面的编译是否成功,如果编译成功,那么就安装成功了
	if [ $? -eq 0 ]
		then 
			echo "=========================安装成功=========================="
	else
		echo "======================================安装失败=============================="
	fi	

}

##安装wget
yum install -y wget
if [ !$? -eq 0]
	then
		exit
fi

#调用函数
install_nginx

自动安装JDK

  • wget下载jdk的时候有点问题,需要动态验证,因此这里使用的链接是 wget --no-cookies --no-check-certificate --header "Cookie:gpw_e24=http%3a%2f%2fwww.oracle.com%2ftechnetwork%2fjava%2fjavase%2fdownloads%2fjdk8-downloads-2133151.html;oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz
  • 可以直接替换后面的链接为对应的jdk版本即可
  • 点击下载
#!/bin/bash

## 文件夹的路径
JDK_PATH=/usr/local/java/jdk
# 解压缩之后的jdk的路径,jdk就在这个文件夹下面
JDK_INSTALL_PATH=/usr/local/java/jdk/jdk-8u181-linux-x64
## 自动安装jdk的函数
function install_jdk()
{
        if [ -d $JDK_PATH ]
                then
                        echo "==============================jdk的安装目录已经存在,现在开始安装======================================"
                else
                        mkdir -p $JDK_PATH
                        echo "==============================新建JDK的安装目录成功========================================================"
        fi      

        ## 切换到安装目录
        cd $JDK_PATH

        ## 安装目录创建成功,开始下载文件了,这里下载的是jdk的1.8版本
        while [ true ]
                do
                        wget --no-cookies --no-check-certificate --header "Cookie:gpw_e24=http%3a%2f%2fwww.oracle.com%2ftechnetwork%2fjava%2fjavase%2fdownloads%2fjdk8-downloads-2133151.html;oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz
                        # 检查是否下载成功,如果下载成功,那么可以跳出这个循环,下载失败继续下载
                        if [ $? -eq 0 ]
                                then
					## 下载成功之后,需要解压缩文件
					tar -xzvf jdk-8u181-linux-x64.tar.gz
					## 删除压缩包
					rm -f jdk-8u181-linux-x64.tar.gz
                                        break
                        fi

                done

	
	## 下载成功之后需要为其中的所有文件赋予可执行的权限
	cd $JDK_INSTALL_PATH

	for file in $JDK_INSTALL_PATH/*
		do
			## 如果是文件夹,那么需要为这个文件夹下的所有文件都赋予权限
			if [ -d $file ]
				then
					chmod a+x $file/*
			else
				chmod a+x $file
			fi		
		done
}	
	

## 安装tomcat

## Tomcat的安装路径
TOMCAT_PATH=/usr/local/java/tomcat8/
TOMCAT_INSTALL_PATH=/usr/local/java/tomcat8/apache-tomcat-8.5.34

function install_tomcat8()
{
	if [ -d $TOMCAT_PATH ]
		then
			echo "=================TOMCAT的安装路径已经存在========================="
	else
		echo "==========================TOMCAT的安装路径不存在=========================="
		mkdir -p $TOMCAT_PATH
	fi	

	cd $TOMCAT_PATH
	while [ true ]
		do	
			wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.34/bin/apache-tomcat-8.5.34.tar.gz
			if [ $? -eq 0 ]
				then
				tar -xzvf apache-tomcat-8.5.34.tar.gz
				rm -f apache-tomcat-8.5.34.tar.gz
				break
			fi
		done
	
	
	for file in $TOMCAT_INSTALL_PATH/*
		do
			if [ -d $file ]
				then
					cd $file
					num=`ls | wc -l`
		
					if [ $num -eq 0 ]
						then
							continue
					fi
					chmod a+x *
			else
					chmod a+x $file
			fi
		done

}


install_jdk
install_tomcat8
原文  https://chenjiabing666.github.io/2018/10/21/Shell编程/
正文到此结束
Loading...