入门shell脚本基础及原理
更新时间:2021年9月6日 12:01 点击:2504
1.特殊变量
$#:查看变量参数的个数
$0:查看脚本的名字
$!:查看shell后台的pid
$@:查看传递脚本所有参数的列表
$*:查看所有参数的列表,单字符串形式显示
$$:脚本本身进程的ID
$?:上一条命令的结果,显示0则成功,不是0则失败
2.内部环境变量
$PATH SHELL 当前使用的shell UID 当前的用户环境 {0|其它数字}={root|其它用户} HOME 当前使用的用户目录 PWD 当前的目录 HISTFILE 历史命令路径 PS1 #[\u@\h \W]\$ 用户@主机名\目录\$
3.整数以及字符判断
3.1整数判断
-eq 测试俩个整数是否相等 (equal) -ne 测试俩个整数是否不等 (unequal) -gt 测试一个数是否大于一个数 (greater than) -lt 测试一个数是否小于一个数 (less than) -ge 测试一个数大于或等于 -le 测试一个数小于或等于
3.2字符测试
=~ 测试是否被正则表达式匹配 -z "string" 检测字符是否为空,空则真,不空则假 如: [ -z "" ]为真空则为真 -n "string" 检测字符是否不空,不空则真,不空则假 字符相比较大小用[[ ]],比的是第一个字母(a-zA-Z)都是大写或者都是小写比较ascii值 越大则越大 有大写又有小写则A>a B>b 但是A不大于b的情况 [root@slave02 ~]# [[ "A" < "B" ]] [root@slave02 ~]# echo $? 0 [root@slave02 ~]# [[ "a" < "b" ]] [root@slave02 ~]# echo $? 0
4.文件判断
-e:文件是否存在 -b:测试是否块设备文件 -c:测试是否字符设备文件 -f:测试是否普通文件 -d:测试是否目录 -h:测试是否符号链接文件 -L:测试是否是符号链接文件 -p:测试是否是命名管道文件 -S:测试是否是套接字文件 权限相关: -r 读 -w 写 -x 执行 特殊权限 -g -u -k 等
5.read输入
选项: -p:指定提示符 -t:指定提示等待的时间(秒)
6.if判断
多分支: if [ 条件 ];then statement1 ..... elif [ 条件2 ];then statement2 .... else statement3 .... fi
7.案例选择判断
case $变量名 in 'value1') statement ... ;; 'value2') statement ... ;; *) statement .. ;; esac #case支持的通配符: * //任意长度任意字符 ? //任意单个字符 [] //指字范围内的任意单个字符 start|START //俩种选择
8.for循环
第一种: for ((expr1;expr2;expr3)) # expr1:初始值条件 #expr2:循环的范围进行退出 #expr3:变量的值使用 { 循环体 } for ((expr1;expr2;expr3));do 循环体 done 第二种: for 变量 in 列表; do 循环体 done
9.while循环
while循环用于不知道循环次数的场景,注意有退出条件 while [ 条件 ];do statement ..... done
10.深入练习
1.写一个脚本,输入三个数字进行相应的加减乘除
[root@slave02 ~]# cat script01.sh #!/bin/bash a=$1 b=$2 c=$3 num1=$[$a+$b+$c] num2=$[$a-$b-$c] num3=$[$a*$b*$c] echo "$a + $b + $c" = $num1 echo "$a - $b - $c" = $num2 echo "$a * $b * $c" = $num3 awk "BEGIN{printf \"$a/$b/$c=%.2f\n\",$a/$b/$c}" [root@slave02 ~]# source script01.sh 100 10 9 100 + 10 + 9 = 119 100 - 10 - 9 = 81 100 * 10 * 9 = 9000 100/10/9=1.11
2.猜数字游戏
规则:指定一个数字,只要猜到了这个数字则过关,否则显示数字大了或者数字小了
[root@master ~]# cat test03.sh #!/bin/bash nums=99 read -p "please enter a number: " num if [ $num -gt $nums ];then echo "数字大了" elif [ $num -lt $nums ];then echo "数字小了" else echo "猜对" fi [root@master ~]# . test03.sh please enter a number: 10 数字小了 [root@master ~]# . test03.sh please enter a number: 100 数字大了 [root@master ~]# . test03.sh please enter a number: 99 猜对
3.写一个脚本,让nginx服务设置开机自启
#$0是nginx本身 $1是变量对应着下面的start|stop|restart|status [root@192 init.d]# pwd /etc/init.d [root@192 init.d]# cat nginx #!/bin/bash case $1 in 'start') /usr/local/nginx/sbin/nginx ;; 'stop') /usr/local/nginx/sbin/nginx -s stop ;; 'restart') /usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx ;; 'status') num=$(ps -ef |grep -v 'grep'|grep -c nginx:) if [ $num -eq 0 ];then echo "nginx is stoped" else echo "nginx is running" fi ;; *) echo "Usage: service $0 start|stop|restart|status" ;; esac #当判断有nginx进程数量则认为开启服务,否则认为服务开启失败
4.利用for循环,创建user序号1-100的用户
#创建用户user1-100 [root@master ~]# cat test05.sh #!/bin/bash for (( i=1;i<=100;i++));do useradd user$i id user$i &>/dev/null if [ $? -eq 0 ];then #只要判断用户成功,$?才会显示0,显示0则代表执行下一条命令,否则显示user以及存在 echo "success" else echo "user is exis" fi done
5.利用while循环,计算1+2…100的值
[root@slave02 ~]# cat which.sh #!/bin/bash s=0 #初始值0 i=1 #判断的数值,最终到100停止 while [ $i -le 100 ];do s=$[$s+$i] i=$[$i+1] #自增加数 done echo $s [root@slave02 ~]# source which.sh 5050 #随便输入一个数字进行计算的话,把100改为$1即可
6.apache简单的一个编译部署脚本
1.一般项目或者脚本,文件,放在相应的位置里,方便查找 [root@slave02 tmp]# pwd /tmp [root@slave02 tmp]# ls apache [root@slave02 apache]# ls install_apache.sh soft [root@slave02 soft]# ls apr-1.7.0.tar.bz2 apr-util-1.6.1.tar.bz2 httpd-2.4.48.tar.bz2 httpd.service [root@slave02 apache]# cat install_apache.sh #!/bin/bash echo "欢迎使用此脚本" apachedir=/usr/local/apache if [ $UID -ne 0 ];then echo "伙计,请使用管理员身份运行" fi echo "正在安装依赖包..." yum -y install epel-release bzip2 "@Development Tools" &>/dev/null yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ make &>/dev/null id apache &>/dev/null if [ $? -ne 0 ];then useradd -r -M -s /sbin/nologin apache fi cd /tmp/apache/soft/ tar -xf apr-1.7.0.tar.bz2 tar -xf apr-util-1.6.1.tar.bz2 tar -xf httpd-2.4.48.tar.bz2 sed -i '/ $RM "$cfgfile"/d' apr-1.7.0/configure echo "正在编译安装apr,请听听歌放松放松......." cd apr-1.7.0/ [ ! -d /usr/local/apr ] if [ $? -eq 0 ];then ./configure --prefix=/usr/local/apr && make && make install &>/dev/null else echo "apr已经安装" fi cd ../apr-util-1.6.1/ [ ! -d /usr/local/apr-util ] if [ $? -eq 0 ];then ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install &/dev/null else echo "apr-util已经安装" fi cd ../httpd-2.4.48/ [ ! -d /usr/local/apache/ ] if [ $? -eq 0 ];then ./configure --prefix=$apachedir \ --sysconfdir=/etc/httpd24 \ --enable-so \ --enable-ssl \ --enable-cgi \ --enable-rewrite \ --with-zlib \ --with-pcre \ --with-apr=/usr/local/apr \ --with-apr-util=/usr/local/apr-util/ \ --enable-modules=most \ --enable-mpms-shared=all \ --with-mpm=prefork make && make install &>/dev/null else echo "httpd已经安装" fi cd #有影响的加判断,没影响的忽略 echo "export PATH=$apachedir/bin:\$PATH" > /etc/profile.d/httpd.sh ln -s $apachedir/include/ /usr/include/apache &>/dev/null grep 'apache/man' /etc/man_db.conf &>/dev/null if [ $? -eq 1 ];then sed -i "20aMANDATORY_MANPATH $apachedir/man" /etc/man_db.conf else echo "apache is help exists" fi [ ! -f /usr/lib/systemd/system/httpd.service ] if [ $? -eq 0 ];then cp /clq/apache/soft/httpd.service /usr/lib/systemd/system/ else echo "已经存在文件跳过" fi systemctl daemon-reload systemctl enable --now httpd num02=$(ps -ef |grep -v 'grep'|grep -c httpd) if [ $num02 -eq 0 ];then echo "httpd自启失败" else echo "httpd自启成功" fi echo "欢迎下次使用" [root@slave02 apache]# chmod +x install_apache.sh [root@slave02 apache]# source install_apache.sh [root@slave02 apache]# source install_apache.sh 欢迎使用此脚本 正在安装依赖包... 正在编译安装apr,请听听歌放松放松....... apr以及安装 apr-util以及安装 httpd已经安装 apache is help exists 已经存在文件跳过 httpd自启成功 欢迎下次使用 [root@slave02 ~]# systemctl status httpd.service ● httpd.service - Start http Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2021-09-04 17:45:33 CST; 5h 57min ago Main PID: 834761 (httpd) Tasks: 7 (limit: 5782) Memory: 6.3M CGroup: /system.slice/httpd.service ├─834761 /usr/local/apache/bin/httpd -k start ├─835358 /usr/local/apache/bin/httpd -k start ├─835359 /usr/local/apache/bin/httpd -k start ├─835360 /usr/local/apache/bin/httpd -k start ├─835361 /usr/local/apache/bin/httpd -k start ├─835362 /usr/local/apache/bin/httpd -k start └─836063 /usr/local/apache/bin/httpd -k start [root@slave02 ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 *:80 *:* LISTEN 0 128 [::]:22 [::]:*
以上就是入门shell脚本基础解析的详细内容,更多关于shell脚本的资料请关注猪先飞其它相关文章!
上一篇: Linux的netstat命令详解
下一篇: Linux运维基础httpd静态网页教程
相关文章
- webshell对于我们站长来讲肯定听到比较多了,我们网站可能经常被人使用期webshell方式注入一些东西了,下面一起来看一个php webshell下直接反弹shell的例子,具体如下。...2016-11-25
- 本文为那些对学习 Windows PowerShell 命令行和脚本编写环境感兴趣的系统管理员提供了资源。也请告诉我们本网站如何才能对您更有用处。...2020-06-30
- 这篇文章主要介绍了Shell脚本中让进程休眠的方法,本文讲解的就是sleep的用法,可以实现睡觉若干秒、若干分钟、若干小时,需要的朋友可以参考下...2020-07-11
- 这篇文章主要介绍了Linux 下使用shell脚本定时维护数据库,本文通过案例分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
- 这篇文章主要介绍了shell脚本实战-while循环语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-09
- 这篇文章主要介绍了Shell字符串比较相等、不相等方法小结,本文直接给出代码,但代码中含有大量注释,需要的朋友可以参考下...2020-07-11
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
这篇文章主要介绍了 JavaScript 实现自己的安卓手机自动化工具脚本,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-14- 这篇文章主要介绍了shell中的for循环用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-11
- 这篇文章主要介绍了自动设置安卓手机wifi代理的PowerShell脚本,帮助大家进行抓包测试,感兴趣的朋友可以了解下...2020-10-17
PowerShell中使用Get-Date获取日期时间并格式化输出的例子
这篇文章主要介绍了PowerShell中使用Get-Date获取日期时间并格式化输出的例子,本文讲解了直接调用Get-Date、在Write-Host中使用Get-Date、格式化输出的方法,需要的朋友可以参考下...2020-06-30PowerShell读取文件内容、替换文件内容、读取限定行的例子
这篇文章主要介绍了PowerShell读取文件内容、替换文件内容、读取限定行的例子,本文使用3个例子来说明实现这3个需求的操作技巧,需要的朋友可以参考下...2020-06-30- 周一今天给大家分享shell脚本多实例部署nginx的详细教程,文章通过实例代码脚本给大家详细介绍,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧...2021-10-26
- 这篇文章主要介绍了Shell脚本8种字符串截取方法总结,每个方法给出了实例代码和操作结果,一目了然,需要的朋友可以参考下...2020-07-11
- 这篇文章主要介绍了Linux Shell脚本中获取本机ip地址方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-20
- 这篇文章主要介绍了mac使用Shell(终端)SSH连接远程服务器的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-11
- 这篇文章主要介绍了Shell逐行读取文件的4种方法,本文介绍了while循环法、重定向法、管道法、文件描述符法等一些方法,需要的朋友可以参考下...2020-07-11
- 这篇文章主要介绍了批量复制及执行命令shell脚本,本文通过列举几个示例给大家详细介绍,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
- 这篇文章主要介绍了Shell用sed命令删除特定行的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-20
- 这篇文章主要介绍了Shell脚本中执行sql语句操作mysql的5种方法,本文讲解了将SQL语句直接嵌入到shell脚本文件中、命令行调用单独的SQL文件、使用管道符调用SQL文件等方法,需要的朋友可以参考下...2020-07-11
- 下面小编就为大家带来一篇详谈Ubuntu PowerShell(小白入门必看教程)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-30