前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell编程

Shell编程

作者头像
爱撒谎的男孩
发布2019-12-31 15:41:08
5160
发布2019-12-31 15:41:08
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

1. Shell编程

1.1. 变量

1.2. 位置参数变量

1.2.1. $*与$@的区别

1.2.2. 实例

1.3. 预定义变量

1.4. 运算符

1.4.1. 基本语法

1.4.2. 实例

1.5. 判断语句

1.5.1. 基本语法

1.5.2. 常用判断条件

1.5.3. 实例

1.6. 流程控制

1.6.1. if

1.6.1.1. 基本语法

1.6.1.2. 实例

1.6.2. case

1.6.2.1. 基本语法

1.6.2.2. 实例

1.6.3. for循环

1.6.3.1. 基本语法

1.6.3.2. 实例

1.6.4. while循环

1.6.4.1. 基本语法

1.6.4.2. 实例

1.7. read读取控制台输入

1.7.1. 基本语法

1.7.2. 实例

1.8. 函数

1.8.1. 系统函数

1.8.2. 自定义函数

1.9. 定时任务调度 crond

1.10. 自动安装Nginx

1.11. 自动安装JDK

Shell编程

变量

  • 定义变量:name="陈加兵"
  • 撤销变量:unset name
  • 声明静态变量:readonly name="陈加兵"
    • 静态变量不能unset,否则报错
  • 使用变量:${}或者$变量
    • echo "姓名:${name}"或者echo "姓名:$name"
  • 系统环境变量:export A="陈加兵"
    • vim /etc/profile,在末尾添加即可
    • source /etc/profile ,让环境配置立即生效,否则只能重启系统才能生效
    • shell中使用环境变量:$name

位置参数变量

  • 基本语法:
    • $n(功能描述: n 为数字, $0 代表命令本身, $1-$9 代表第一到第九个参数,十以上 的参数,十以上的参数需要用大括号包含,如${10})
    • $*功能描述:这个变量代表命令行中所有的参数, $*把所有的参数看成一个整体,不包含命令本身
    • $@ 功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 ,不包含命令本身
    • $#功能描述:这个变量代表命令行中所有参数的个数,不包含命令的本身

$*与$@的区别

  • $*$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数
  • 当它们被双引号“”包含时, $*会将所有的参数作为一个整体,以“$1 $2 …$n”的形 式输出所有参数; “$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数
代码语言:javascript
复制
#!/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如下
代码语言:javascript
复制
#!/bin/bash
# 输出命令本身和前两个参数
echo "$0 $1 $2"
# 输出所有的参数,不包含命令本身
echo "$*"
# 输出所有的参数,不包含命令本身
echo "$@"
#输出参数的个数,不包含命令本身
echo "$#"
  • 执行该脚本./first.shell 1 2

预定义变量

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

运算符

基本语法

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

实例

代码语言:javascript
复制
A=$[(1+2)*4*4]
echo "${A}"
unset A

判断语句

基本语法

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

常用判断条件

  • 两个整数之间比较
    • =字符串比较
    • -lt 小于
    • -le小于等于
    • -eq 等于
    • -gt 大于
    • -ge 大于等于
    • -ne 不等于
  • 按照文件权限比较
    • -r有读的权限
    • -w 有写的权限
    • -x 有执行的权限
  • 按照文件类型进行判断
    • -f 文件存在并且是一个常规的文件
    • -e 文件存在
    • -d 文件存在并是一个目录

实例

  • 23 是否大于等于 22:[ 23 -ge 22 ]
  • student.txt 是否具有写权限 :[ -w student.txt ]
  • /root/install.log 目录中的文件是否存在 :[ -e /root/install.log ]

流程控制

if

基本语法
代码语言:javascript
复制
if [ 条件判断式 ];then
程序
fi

# 或者
if [ 条件判断式 ]
then
程序
fi
实例
  • if-else
代码语言:javascript
复制
if [ -e /usr/local/shell/five.shell ] 
 then 
        echo "陈加兵" 
fi
  • if-elseif-els
代码语言:javascript
复制
#!/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

基本语法
代码语言:javascript
复制
case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
实例
代码语言:javascript
复制
#!/bin/bash

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

case ${A} in

"1")
        echo "1"

;;

"2")
        echo "2"
;;

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

for循环

基本语法
  • 语法一
代码语言:javascript
复制
for 变量 in 值 1 值 2 值 3…
do
程序
done
  • 语法二
    • 双括号
代码语言:javascript
复制
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
实例
代码语言:javascript
复制
#!/bin/bash

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

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

while循环

基本语法
代码语言:javascript
复制
while [ 条件判断式 ]
do
程序
done
实例
代码语言:javascript
复制
#!/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:指定读取值时等待的时间(秒)。

实例

代码语言:javascript
复制
#!/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/

自定义函数

  • 格式:
代码语言:javascript
复制
[ function ] funname[()]
{
Action;
[return int;]
}

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

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

## 调用函数
sum $n1 $n2

定时任务调度 crond

自动安装Nginx

  • 本人写了一个自动安装Nginx的脚本,适合Centos的安装,亲测有用,点击下载
代码语言:javascript
复制
#!/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版本即可
  • 点击下载
代码语言:javascript
复制
#!/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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Shell编程
    • 变量
      • 位置参数变量
        • $*与$@的区别
        • 实例
      • 预定义变量
        • 运算符
          • 基本语法
          • 实例
        • 判断语句
          • 基本语法
          • 常用判断条件
          • 实例
        • 流程控制
          • if
          • case
          • for循环
          • while循环
        • read读取控制台输入
          • 基本语法
          • 实例
        • 函数
          • 系统函数
          • 自定义函数
        • 定时任务调度 crond
          • 自动安装Nginx
            • 自动安装JDK
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档