在shell脚本运行时,会先查找系统环境变量ENV,该变量指定了环境文件(加载顺序通常是/etc/profile ~/.bash_profile ~/.bashrc /etc/bashrc)

设置全局变量:
declare -x 变量名
export 变量名

常见全局变量配置文件: /etc/profile、/etc/bashrc、/etc/profile.d/目录下

/etc/motd 登录提示

当位置参数大于9时,需要使用{}括起来 ,${10}

dirname 获取路径
basename 获取文件名

for i ;do echo $i;done #相当于for i in "$@"

$!获取上一次执行脚本的PID

echo ${#parameter} 打印变量值的长度

${var:2:2} 从第二个字符开始截取,截取两个字符。

${var/oldboy/oldgirl} 替换第一个匹配的字符串

${var//oldboy/oldgirl} 替换匹配的所有字符串

${parameter:=word}
如果parameter变量值为空或未赋值,就设置这个变量值为word,并返回其值

${parameter:-word}
如果parameter变量值为空或未赋值,则会返回word字符串替代变量的值

${parameter:-word}
如果parameter变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值

${parameter:+word}
如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值

RETVAL=$?

find ${path-/tmp} -name "*.tar.gz" -type f -mtime +7 --delete

计算字符串长度的方法:

[root@localhost scripts]# char="I am Template"
[root@localhost scripts]# expr length "$char"
13
[root@localhost scripts]# echo ${#char}
13
[root@localhost scripts]# echo ${char} | wc -L
13
[root@localhost scripts]# echo $char |awk '{print length($0) }'
13

通过命令输出1+2+3+4+5+6+7+8+9+10

[root@localhost scripts]# seq -s "+" 10 #-s 指定分割符默认为空格
1+2+3+4+5+6+7+8+9+10

[root@localhost scripts]# echo {1..10} |tr " " "+"
1+2+3+4+5+6+7+8+9+10

[root@localhost scripts]# echo `seq -s '+' 10` =`seq -s " + " 10|xargs expr`
1+2+3+4+5+6+7+8+9+10 =55

[root@localhost scripts]# echo "10 9" | awk '{print ($1-$2)}'
1

[root@localhost scripts]# declare -i A=10 =18 #声明整数为整型之后,可以相加
[root@localhost ~]# A=A+B
[root@localhost ~]# echo $A
28

我们可以利用expr做计算时变量或字符串必须是整数的规则,来判断一个变量是否为整数
#!/bin/bash
expr $1 + 1 &>/dev/null
[ $? -eq 0 ] && echo int || echo chars

#变量的子串

#!/bin/bash
a=$1
b=$2
[ ${#a} -le 0 ] && {
echo "The first number is null"
exit 1
}
[ ${#b} -le 0 ] && {

echo "The second num is null"
exit 1

}

echo `expr $a + $b`

##0+0 expr计算之后返回退出状态码1

[root@localhost ~]# expr 0 + 0
0
[root@localhost ~]# echo $?
1

#条件测试与比较
[[ ]] 在双中括号中可以使用通配符等进行模式匹配

&& || > <等操作符可以应用于[[]]中,但不能应用于[]中,在[]中一般用-a -o -gt(用于整数) -lt(用于整数)

对于整数的运算关系,也可以使用shell的算术运算符(( ))

#测试时变量的特殊写法及问题,用[]测试变量时,如果被测试的变量不加双引号,测试结果可能会是不正确的
[root@localhost ~]# echo $test 这是一个不存在的变量

[root@localhost ~]# [ -f $test ] && echo 1 || echo 2 不加双引号测试变量,逻辑不对了
1

[root@localhost ~]# [ -f "$test" ] && echo 1 || echo 2 加了双引号逻辑就丢了
2

添加一个IP的方法
ip addr add 192.168.8.29/24 dev eth0 label eth0:0

#通过nc命令检测服务是否正常
[root@localhost scripts]# nc -w 2 127.0.0.1 80
[root@localhost scripts]# echo $?
0

#使用wget或curl命令测试网站或数据库是否正常
[root@localhost scripts]# wget --spider --timeout=10 --tries=2 www.baidu.com &> /dev/null
#--spider的意思是模拟爬取 --tries 表示如果不成功则重试两次
[root@localhost scripts]# echo $?
0

[root@localhost scripts]# wget -T 10 -q --spider www.baidu.com
[root@localhost scripts]# echo $?
0
#-q 表示安静的

#使用curl
[root@localhost scripts]# curl -I -s -w "%{http_code}\n" -o /dev/null www.baidu.com
200

#使用nmap远程监控
[root@localhost scripts]# nmap 127.0.0.1 -p 80 | grep open | wc -l
1

#测试网站是否正常脚本

脚本1
------------------------------------------------------
#!/bin/bash
if [[ `curl -I -s -o /dev/null -w "%{http_code}" 127.0.0.1` =~ "200"|"301"|"302" ]];then
echo "Nginx is running"
else
echo "Nginx is Stopped"
/etc/init.d/nginx
fi
------------------------------------------------------

脚本2

============================================================
#!/bin/bash
if [ `curl -I 127.0.0.1 2> /dev/null | head -1 | egrep "200|301|302" | wc -l` -eq 1 ];then
echo "Nginx is running."
else
echo "Nginx is down"
/etc/init.d/nginx
fi
============================================================

#比较两个整数的(传参方式)
------------------------------------------------------------
#!/bin/bash

a=$1
b=$2

Usage(){

echo "Usage:$0 NUM1 NUM2"
exit 2
}

[ $# -ne 2 ] && { ##判断传参个数
Usage
}

expr $a + 1 &> /dev/null #使用expr只能计算两个整数的原理,判断传入的参数是否为整数
RETVAL_A=$?
expr $b + 1 &> /dev/null
RETVAL_B=$?

[ $RETVAL_A -ne 0 -o $RETVAL_B -ne 0 ] && {

echo "you must input integer "
exit 1
}

if [ "$a" -lt "$b" ];then
echo "$a < $b"
elif [ "$a" -gt "$b" ];then
echo "$a > $b"
else
echo "$a = $b"
fi
exit 0
------------------------------------------------------------

##判断字符串是否为数字

a=$1
[[ "$a" =~ ^[0-9]+$ ]] && echo int || echo char

##判断字符串长度几种方法
[root@localhost scripts]# expr length Template
8
[root@localhost scripts]# var=Template
[root@localhost scripts]# echo ${#var}
8
[root@localhost scripts]# echo $var | wc -L
8
[root@localhost scripts]# echo $var | awk '{print length}'
8

-------------------------
#!/bin/bash
a=$1
b="^[0-9]{5}-[0-9]{3}$"
if [[ "$a" =~ $b ]];then
echo num
else
echo nonu
fi
-----------------------------

##shell函数的语法
函数的语法
function 函数名 () {
}

function 函数名 {
}

函数名(){
}

在shell函数里面,return命令的功能和exit类似,return的作用是退出函数,而exit是退出脚本文件

return会返回一个退出值给调用函数的当前程序,而exit会返回一个退出值给执行程序的当前shell

##最小化服务
chkconfig | egrep "sshd|crond|network|rsyslog|sysstat" | awk '{print "chkconfig",$1,"on"}' | bash

##shell调用脚本的模式

fork 模式调用 : fork模式是最普通的脚本调用方式,即直接在脚本里面用/bin/sh /directory/scrpit.sh 来调用 使用此方式来调用脚本的时候,会开启一个子sehll执行调用脚本,子shell调用的

        时候父shell还在,子shell执行完毕后返回到父shell,此模式下子shell的环境变量不能带回父shell,但是可以从父shell继承环境变量

exec 模式调用:exec模式调用脚本,被调用的脚本与父脚本在同一个shell内执行,但是使用exec调用一个新脚本以后,父脚本中exec执行之后的脚本内容就不会再执行了,这就是exec和source的区别

source 模式调用:source调用脚本与fork模式的区别是不会新开一个子shell来执行被调用脚本,而是在同一个Shell中执行,所以在被调用的脚本中声明的变量和环境变量都可以在主脚本中获取和使用

shell 流水账的更多相关文章

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

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

  2. 2014 Hangjs 见闻流水账第二天

    前言 第一天传送门: 2014 Hangjs 见闻流水账第一天 写作风格跟第一天还是一样的. Slide 每个slide我都会根据自己的理解重新命名一次,用于表达自己的第一看法,主观意见,不喜可吐槽, ...

  3. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

  4. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  5. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  6. 第一个shell脚本

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

  7. shell简介

    Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...

  8. Shell碎碎念

    1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...

  9. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

随机推荐

  1. 牛客网Java刷题知识点之匿名对象

    不多说,直接上干货! 匿名对象的两种用途: 1.当对象对方法仅进行一次调用的时候,就可以简化成匿名对象. 2.匿名对象可以作为实际参数进行传递. 匿名对象顾名思义就是没有名字的对象. new Car( ...

  2. Java开发笔记(九十八)利用Callable启动线程

    前面介绍了如何利用Runnable接口构建线程任务,该方式确实方便了线程代码的复用与共享,然而Runnable不像公共方法那样有返回值,也就无法将线程代码的处理结果传给外部,造成外部既不知晓该线程是否 ...

  3. The sixth day

    bound to 铁定You are bound to be fired  你会被铁定开除的 A:Dan forgot his map? Dan忘了带地图了吗? B:Yep!And he's boun ...

  4. Lua学习---函数定义

    1.函数定义的格式: Lua使用function定义函数,语法如下: function function_name (arc) --arc表示参数列表,函数的参数列表可以为空 --body end 上 ...

  5. 快速获取雪碧图的图标样式插件 - gulp-css-spriter教程

    如何快速把合成好的雪碧图,快速获取图标的样式呢? 用gulp-css-spriter很简单. 第一步: 在某个文件夹用shitf+鼠标右键 第二步: npm install gulp-css-spri ...

  6. PIC IDE编译器变量问题

    1.用const关键字是不能把变量定义到ROM区域的,在IDE编译器里要在变量的定义前面加入rom关键字.例如: rom char tmp[257]={0};const rom char tmp[25 ...

  7. 构建第一个Spring Boot2.0应用之Controller(三)

    Controller控制器主要是接收浏览器请求.下面说一说@Controller注解和@RestController的区别: (1)@Controller类中的方法可以直接通过返回String跳转到j ...

  8. /etc/syslog.conf日志配置文件详解

    //将info或更高级别的消息送到/var/log/messages,除了mail以外. //其中*是通配符,代表任何设备:none表示不对任何级别的信息进行记录. *.info;mail.none; ...

  9. sql & sqlalchemy join多个表

    # 连接两个数据表的用法: FROM Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort # 语法格式可以概 ...

  10. 美国L1签证申请的常见问题解析

    美国L1是一种允许在美国和中国都有机构的跨国公司从国外的母公司派遣一定层次的经理或专业技术人员去美国分支机构工作的非移民签证.L1签证分两类:美国L1A是跨国公司经理及主管人员签证,L1B是专门技术人 ...