位置参数变量
$*与$@的区别
-
$*
和 $@
都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$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 "$#"
预定义变量
-
$?
:最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行,如果这个变量的值为非0(具体哪个值是由命令自己决定),则证明上一个命令执行不正确了.
- 这样如果需要判断上一个执行的状态才能进行下一步的操作,那么只需要判断这个是是否为0即可
-
$$
:输出当前进行的进程Id(PID)
-
$!
:后台运行的最后一个进程的PID
#!/bin/bash
echo "$$"
./helloworld.sh &
echo "$!"
echo "$?
运算符
基本语法
实例
A=$[(1+2)*4*4]
echo "${A}"
unset A
判断语句
基本语法
-
[ condition ]
: 注意 condition 前后要有空格
常用判断条件
实例
[ 23 -ge 22 ]
[ -w student.txt ]
[ -e /root/install.log ]
流程控制
if
基本语法
if [ 条件判断式 ];then
程序
fi
# 或者
if [ 条件判断式 ]
then
程序
fi
实例
if [ -e /usr/local/shell/five.shell ]
then
echo "陈加兵"
fi
#!/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读取控制台输入
基本语法
实例
#!/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编程/