1、先查看脚本解释器

[es@bigdata-senior01 ~]$ echo $SHELL
/bin/bash

2、编写最简单的脚本

vi test.sh
#第一行的脚本声明(#!)用来告诉系统使用哪种 Shell 解释器来执行该脚本
#!/bin/bash
#查看当前目录,按文件大小列出文件
pwd
ls -lSh
Shell 脚本文件的名称可以任意,但为了避免被误以为是普通文件,将.sh 后缀加上,以表示是一个脚本文件。

3、执行脚本的方式

第一种:用解释器执行,sh/bash或都可以,用subshell方式开打
[es@bigdata-senior01 ~]$ bash test.sh 第二种:通过./方式直接执行,用subshell方式开打,需要有“执行权限”,通过chmod来添加
[es@bigdata-senior01 ~]$ ./test.sh 第三种:用source来执行,在当前shell内去读取,变量会被设置到当前shell环境中
[es@bigdata-senior01 ~]$ source test.sh
source可以省略为"."
[es@bigdata-senior01 ~]$ . test.sh #注意.后面有空格


注意:第二种方式如果出现权限不足的情况,那么注意看看文件有没有执行权限

[es@bigdata-senior01 ~]$ ./test.sh
-bash: ./test.sh: 权限不够 因为test.sh没有执行权限,我们查看一下
[es@bigdata-senior01 ~]$ ll test.sh
-rw------- 1 es es 167 1月 8 15:25 test.sh
没有x,没有执行权限,所以加一下就可以
[es@bigdata-senior01 ~]$ chmod 700 test.sh 如果要给所有人权限
[es@bigdata-senior01 ~]$ chmod 777 test.sh

4、脚本参数,例如:./test02.sh one two three four five

$0 表示当前 Shell 脚本程序的名称
$# 表示总共有几个参数
$* 表示所有位置的参数值
$? 表示shell返回值
$1、$2、$3……则分别对应着第 N 个位置的参数值

用例

[es@bigdata-senior01 ~]$ cat test02.sh
#!/bin/bash
echo "脚本名称:$0"
echo "脚本共有参数$#个"
echo "脚本参数:$*"
echo "脚本第一个参数:$1"
echo "脚本第三个参数:$3" [es@bigdata-senior01 ~]$ bash test02.sh one two three four five
脚本名称:test02.sh
脚本共有参数5个
脚本参数:one two three four five
脚本第一个参数:one
脚本第三个参数:three

5、条件测试,Shell 脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值。

[ 条件表达式 ] #注意表达式两端各有一个空格

5.1 文件测试:

-d  测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行

用例:

判断test02.sh是否是目录,结果非0,为不符合
这个判断原则其实与程序(列入java程序)退出代码一致,退出代码为0表示正常退出,退出代码>0就是异常退出
[es@bigdata-senior01 ~]$ [ -d test02.sh ]
[es@bigdata-senior01 ~]$ echo $?
1
判断test02.sh是否是文件,结果为0,符合
[es@bigdata-senior01 ~]$ [ -f test02.sh ]
[es@bigdata-senior01 ~]$ echo $?
0

5.2 逻辑与(&&),在 Shell终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令

[es@bigdata-senior01 ~]$ [ -f test02.sh ] && echo "ok"
ok

5.3 逻辑或(||),表示当前面的命令执行失败后才会执行它后面的命令

[es@bigdata-senior01 ~]$ [ -d test02.sh ] || echo "不是目录"
不是目录 [es@bigdata-senior01 ~]$ [ $USER = 112 ] && echo "用户是es" || echo "用户不是es"
用户不是es
[es@bigdata-senior01 ~]$ [ $USER = es ] && echo "用户是es" || echo "用户不是es"
用户是es

5.4 逻辑“非”(!),在 Linux系统中的运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值

[es@bigdata-senior01 ~]$ [ ! $USER = es ] && echo "用户是es" || echo "用户不是es"
用户不是es

6、整数比较运算符,因为=,<,>这些符号和赋值以及重定向冲突,所以shell脚本中,整数比较使用英文简写来代替的

-eq  是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于

用例:

取空闲内存:
[es@bigdata-senior01 ~]$ freeMem=$(free -m | grep Mem | awk '{print $4}')
或者
[es@bigdata-senior01 ~]$ freeMem2=`free -m | grep Mem | awk '{print $4}'` [es@bigdata-senior01 ~]$ [ $freeMem -lt 1024 ] && echo "内存不足" || echo "内存正常"
内存正常
[es@bigdata-senior01 ~]$ echo $freeMem
1552

7、字符串比较,只有等于、不等于、空等。

=  比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
[es@bigdata-senior01 ~]$ [ $LANG != "zh_CN.UTF-8" ] && echo "需要中文字符集" || echo "是中文字符集"
是中文字符集

8、流程控制,if、for、while、case等

8.1 if条件

语法:
if 条件
then 命令1
else 命令2
fi 结束if 语法2:
if 条件
then 命令1
elif 条件2
  then 命令2
else
命令3
fi 结束if

用例1:vi createHomeData.sh

#!/bin/bash
#在用户home目录下,如果不存在data目录就创建data目录,然后拷贝数据到该目录
dir=${HOME}"/data" #字符串连接,将$HOME变量和字符串"/data"连接
if [ ! -e $dir ]
then
echo "目录$dir不存在,创建..."
mkdir -p $dir
cp /opt/elasticsearch*/config/*.yml $dir
else
cp /opt/elasticsearch*/config/*.yml $dir
fi
ls -d $dir
ls -l $dir

用例2:vi checkHost.sh

#!/bin/bash
#检查参数1所表示的主机是否在线
if [ -z $ ]
then
echo "请输入主机IP或名字"
exit
fi
echo "正在连接..."
ping -c -i 0.2 -W $ &> /dev/null
if [ $? -eq ]
then
echo "Host:$1在线"
else
echo "Host:$1不在线"
fi
[es@bigdata-senior01 ~]$ ./checkHost.sh www.google.com
正在连接...
Host:www.google.com不在线
[es@bigdata-senior01 ~]$ ./checkHost.sh 114.114.114.114
正在连接...
Host:114.114..114在线
[es@bigdata-senior01 ~]$ ./checkHost.sh
请输入主机IP或名字

检查端口是否开放

#!/bin/bash
if [ -z $1 ] ; then
echo "请输入需要检测IP和端口文件"
exit
fi if [ ! -e $1 ] ; then
echo "文件不存在,请重新确认"
exit
fi File=$1 cat $File | while read host
do
nc -zvw5 $host &> /dev/null
if [ $? -eq 0 ] ; then echo "host: $host 开放"
else echo "host: $host 关闭"
fi done

用例3: vi checkScores.sh

#!/bin/bash
#输入分数,判断分数等级
read -p "输入分数0-100: " grade
if [ $grade -ge ] && [ $grade -le ] ; then
echo "grade A"
elif [ $grade -ge ] && [ $grade -lt ] ; then
echo "grade B"
elif [ $grade -ge ] && [ $grade -lt ] ; then
echo "grade C"
else
echo "grade D"
fi

8.2 for循环

语法:
for 被循环自动赋值的变量 in 取值列表
do
执行各种命令
done

用例1:vi createUsers.sh

先准备一个userlist.txt,里面加一下用户名称,如下:
[es@bigdata-senior01 ~]$ cat userlist.txt
tom
amy
xu.dm
xu.dm.test
bus
dba

编辑createUsers.sh脚本

#!/bin/bash
# 用重定向到/dev/nul来屏蔽屏幕输出
# 脚本后面需要一个文件名参数
if [ -z $ ] ; then
echo "请在脚本后面输入用户文件列表"
exit
else
if [ ! -e $ ] ; then
echo "输入的文件不存在,请检查后重新输入"
exit
fi
fi read -p "请输入用户密码:" password
users=$(cat $) #注意等号两边不能有空格,shell语法坑死人
echo $users
for uname in $users
do
id $uname &> /dev/null
if [ $? -eq ] ; then
echo "$uname,用户已经存在!"
else
useradd $uname &> /dev/null
echo "$password" | passwd --stdin $uname &> /dev/null
if [ $? -eq ] ; then
echo "$uname,创建成功"
else
echo "$uname,创建失败"
fi
fi done
执行脚本:
[es@bigdata-senior01 ~]$ sudo ./createUsers.sh userlist.txt
请输入用户密码:@abc.com
tom amy xu.dm xu.dm.test bus dba
tom,创建成功
amy,创建成功
xu.dm,用户已经存在!
xu.dm.test,创建成功
bus,创建成功
dba,创建成功

用例2:vi checkHosts.sh,检查文件列表里的主机是否在线

#!/bin/bash
if [ -z $ ] ; then
echo "请输入主机列表文件"
exit
fi if [ ! -e $ ] ; then
echo "文件不存在,请检查后重新输入"
exit
fi hostlist=$(cat $)
for host in $hostlist ; do
ping -c -i 0.2 -W $host &> /dev/null
if [ $? -eq ] ; then
echo "host:$host 在线"
else
echo "host:$host 不在线或被屏蔽"
fi done
[es@bigdata-senior01 ~]$ ./checkHosts.sh hosts.txt
host:192.168.1.2 在线
host:www.baidu.com 在线
host:www.google.com 不在线或被屏蔽
host:www.cnblogs.cn 在线
host:www.csdn.net 在线
host:www.qq.com 在线

8.3 while语句

语法:
while 条件测试语句
do
执行命令
done

用例1:vi outputNum.sh

#!/bin/bash
#倒序输出数字
if [ -z $ ] ; then
echo "please input a integer number[1-100]"
exit
fi if [ $ -gt ] || [ $ -lt ] ; then
echo "error num,need number between [1-100]"
exit
fi
num=$
while [ $num -ge ] ; do
echo "num:$num"
#num-1有三种写法
#let "num=$num - 1"
#num=$(expr $num - )
let num--
done

用例2:

#!/bin/bash
#测试随机数,需要输入测试次数
if [ -z $ ] ; then
echo "please input test count number"
exit
fi count=$
num=
while [ $count -gt ]
do
echo "第$num次,随机数:$RANDOM"
let num++
let count--
done

8.4、case语句

case 变量值 in
模式1)
命令1;;
模式2)
命令2;;
*)
其他命令;;
esac #就是case反过来和if语句类似,我已经不想吐槽这是什么逻辑
模式字符串中可以使用通配符
如果一个模式字符串中包含多个模式,那么各模式之间应以竖线(|)隔开,表各模式是“或”的关系,即只要给定字符串与其中一个模式相配,就会执行其后的命令列表。
各模式字符串应是唯一的,不应重复出现,并且要合理安排它们的出现顺序。

用例1:修改上面的testRandom.sh

#!/bin/bash
#测试随机数,需要输入测试次数
if [ -z $ ] ; then
echo "please input test count number"
exit
fi case $ in
*[a-z]* | *[A-Z]*)
echo "输入的是字母,需要输入数字"
exit;;
*[-]*)
echo "输入的是数字,符合要求";;
*)
echo "输入非法字符无法继续"
exit;;
esac count=$
num=
while [ $count -gt ]
do
echo "第$num次,随机数:$RANDOM"
let num++
let count--
done

9、break和continue

break:用于立即终止当前循环的执行,break命令可以使用户从循环体中退出来。
语法:break[n] ,其中,n表示要跳出几层循环,默认值为1 continue:跳过循环体中在其之后的语句,会返回到本循环层的开头,进行下一次循环。
–语法:continue[n],其中,n表示从包含continue语句的最内层循环体向外跳到第几层循环,默认值为1,循环层数是由内向外编号。
 

CenOS shell脚本的更多相关文章

  1. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  2. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  3. shell脚本规划化模板

    shell脚本规划化模板 Linux运维过程中,shell脚本是不可缺少的工具,但是每个运维人员编程的习惯都不一样,很多时候就是实现某个功能,写出来的脚本都是烂七八糟的.脚本必须规范化,应该从以后几个 ...

  4. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  5. Linux Shell脚本逻辑操作符简介

    在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...

  6. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  7. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  8. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  9. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

随机推荐

  1. ruby 技巧 根据函数的返回

    一般语言中,函数必须有返回值,即要带个return关键字.但在ruby中,return不是必须的,如果不写会默认返回最终计算的结果.举例 def add(a,b) # 省去了return a + b ...

  2. 虚拟机ubuntu使用串口

    1. 电脑的串口默认是在windows系统上,需要把串口转到ubuntu上面,按照下面的步骤先 2. 找到需要使用的串口 3. 在VMWARE里面连接该串口 或者使用方法 4. 成功之后,检查一下ls ...

  3. EWS3-24S05电源转换芯片DC-DC

    1. EWS3-24S05是24V转5V的DC-DC电源,输入和输出都是直流电. 2. 典型应用 3. 引脚图 4. 使用注意事项: 输入电源的要求 输入电源的要求产品的输入端必需接一个低阻抗的电压源 ...

  4. cc2541测试SimpleBLEPeripheral例程

    1. 修改工程选项,去掉CC2540_MINIDK,烧写CC2541代码 2. 打开手机软件TruthBlue2_7 3. 准备看下特征值4的通信,在周期处理里面,一直读取特征值3的值,然后由特征值4 ...

  5. Qt listwigwt item 加入自定义元素

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  6. katalon系列六:Katalon Studio Web UI关键字讲解

    在一个Test Case里,点左上Add-Web UI Keyword,可以添加一行新的命令. 像Click.setText.Delay这些最基本的,大家还是看看官方的API文档吧,望文知义,如果是纯 ...

  7. Linux命令应用大词典-第45章 服务器配置

    45.1 ssh-agent:存储用于公钥验证的私钥 45.2 ssh-add:添加RSA或DSA身份的认证代理 45.3 ssh-keyscan:收集主机公钥 45.4 sshd:运行sshd守护进 ...

  8. lesson 20 pioneer pilots

    lesson 20 Pioneer pilots driver pilot rider cyclist 骑自行车的人 介词后不加that cover + 距离 = travel 了一段距离 by su ...

  9. SQL语言重点学习

    数据库的操作任务通常包括以下几个方面: 1.查询数据. 2.在表中插入,修改和删除记录. 3.建立,修改和删除数据对象. 4.控制对数据和数据对象的读写. 5.保证数据库一致性和完整性. SQL语言学 ...

  10. python中的迭代器与生成器

    迭代器 迭代器的引入 假如我现在有一个列表l=['a','b','c','d','e'],我想取列表中的内容,那么有几种方式? 1.通过索引取值 ,如了l[0],l[1] 2.通过for循环取值 fo ...