首先看一个简单实例脚本:
首先输入vim hello.sh
新建一个hello.sh的脚本文件:
#!/bin/bash //必须添加的
#第一个脚本 //#代表注释
echo -e "\e[1m;36 努力 \e[0m //输出努力
Shell脚本执行的方法:
chmod 755 hello.sh //赋予权限直接运行
./hello.sh //相对路径和绝对路径均可
bash hello.sh //通过Bash调用执行的脚本
Shell编程之变量的学习
Bash变量的命名规则:
1.变量名必须以字母或下划线字符开头,其余的字符可以是字母,数字(0~9)或下划线字符
2.变量名的长度不得超过255个字符
3.变量名的有效范围必须是唯一的,在Bash中,变量的默认类型都是字符串类型
4.变量的名字是大小写敏感的,给变量赋值时,等号周围不能有任何空白符,为了给变量赋空值,可以在等号后跟一个换行符,若属性值中有空格,需要使用双引号(或单引号)括起来
Shell编程中变量的分类:
1.用户自定义的变量,只在当前的Shell中生效
2.预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
3.位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
4.环境变量:这种变量中主要保存的是和系统操作环境相关的数据,变量可以自己定义,但是对系统生效的环境变量名和变量作用是固定的,即只能改变值,不能改变变量名,环境变量在当前的Shell和这个Shell的子Shell中生效
Shell编程中之变量的调用:
echo $变量名
x=12 调用:echo "$x"34或echo ${x}34 //输出 1234
Shell编程之变量中常用命令:
set //查看系统中所有正在运行的变量
set -u //如果设定此选项,调用未声明变量时会报错(默认无任何提示)
env //查看环境变量
unset 变量名 //删除变量
exit //子Shell退回到父Shell中
bash //进入子Shell
Shell编程之设置环境变量:
export 变量名=变量值 或 变量名=变量值 export 变量名
Shell编程中常用的环境变量:
HOSTNAME:主机名 SHELL:当前的shell TERM:终端环境 HISTSIZE:历史命令条数
SSH_CLIENT:当前操作环境是用ssh连接的,这里记录客户端ip SSH_TTY:ssh连接的终端时pts/1 USER:当前登录的用户
PATH环境变量的介绍和使用:
PATH变量:系统查找命令的路径
PAHT="$PATH":/root //增加PATH变量的值,将root目录添加到PATH中去
PS1环境变量的接受和使用:
推荐的参考博客:linux下环境变量PS1设置: https://my.oschina.net/davehe/blog/95441
cd /usr/local/src/
PS1='[\u@\A \w]\$ ' //修改命令提示符的内容
Bash语系变量的介绍和学习:
locale //查询当前系统语系(LANG:定义系统主语系的变量 LC_ALL:定义整体语系的变量),默认语系存于/etc/sysconfig/i18n文件中
echo $LANG //查看系统当前语系
locale -a | more //查看Linux支持的所有语系
Shell编程之位置参数变量的介绍和学习:推荐的参考博客: Linux 位置参数变量: http://blog.csdn.net/yyywyr/article/details/50245073
Shell编程之预定义变量的介绍和学习:
$?:最后一次执行的命令的返回状态,0表示正确,非0表示错误
ls
echo $? //输出0,表示ls命令执行正确
ls ss
echo $? /输出2,表示命令执行错误
$$:当前进程的进程号(PID)
$!:后台运行的最后一个进程的进程号(PID)
#!bin/bash
echo "$$" #输出的是当前脚本运行的进程PID号
#!bin/bash
find /root -name hello.sh & #加&符号表示在后台执行
echo "$!"
read(接受键盘输入的命令)学习:
#!bin/bash
read -p "input your name:" name #会提示输入name变量的值
echo $name
#常用的命令选项介绍:
-p "提示信息":表示在等待read输入时,输出提示信息
-t 秒数:read命令会一直等待用户输入,-t可以指定等待的时间,如read -p "input:" -t 30 name
-s:隐藏输入的数据,适用于机密信息的输入,如reap -p "input:" -s passwd
-n 字符数:read命令只接受指定的字符数,就会执行,如reap -p "input:" -n 1 name
Shell编程之运算符的学习
declare声明变量类型的介绍:
declare [+/-][选项] 变量名
----选项-:给变量设定类型属性 选项-i:将变量声明为整型(integer)
----选项+:取消变量的类型属性 选项-x:将变量声明为环境变量
----选项-a:将变量声明为数组类型 选项-r:将变量声明为只读变量 -p:显示指定变量的被声明的类型(declare -p:显示系统当中默认所有变量的类型)
举例之将变量声明为数值型:
a=11 b=22
declare -i c=$a+$b
echo $c #输出33,不再是11+22
举例之将变量声明为数组类型:
#定义数组:
movie[0]=a movie[1]=b
declare -a movie[2]=c
#查看数组:
echo ${movie} #输出第一个数组值
echo ${movie[2]}
echo ${movie[*]} #输出所有的数组值
举例之使用declare声明环境变量:
declare -x test=123 #和export作用类似,但是实际是declare命令的作用
expr和let数值运算工具的介绍和使用:
aa=11 bb=22
dd=$(expr $aa + $bb) //计算aa和bb的和,注意+两侧必须有空格
使用"$((运算符))"
或"$[运算符]"
进行数值运算:
aa=11 bb=22
ee=$((14%3)) ff=$(($aa+$bb)) gg=$[$aa+$bb]
Linux编程之变量测试推荐参考博客:(Linux学习之变量测试与内容替换)http://blog.csdn.net/zhengxiangwen/article/details/51582995
Shell编程之条件判断和流程控制
推荐的参考和学习博客:Shell编程之条件判断和流程控制: http://blog.csdn.net/renwotao2009/article/details/51809779
aa=11
bb=22
[ "$aa"=="$bb" ] && echo yes || echo no //注意字符串比较要使用双引号括起来
单分支if语句的注意点:
1.if语句使用fi结尾,和一般语言使用大括号结尾不同
2.[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
3.then后面跟符合条件之后执行的程序,可以放在[]之后,用";"
分割,也可以换行写入,就不需要";"
了
Linux之cut命令的学习博客参考:(linux cut 命令):http://www.cnblogs.com/siqi/p/3608893.html
env | grep USER | cut -d "=" -f 2 //从env中查找root
Linux之awk命令的学习博客参考:(linux awk命令详解):http://blog.csdn.net/wuwenxiang91322/article/details/39672991
df -h | grep sda5 | awk '{print $5}' //获得/dev/sd5使用率
Linux之双分支if语句的学习:
#1.一个简单的例子判断输入的文件是否是目录:
#!/bin/bash
read -t 30 -p "input:" dir
if [ -d "$dir" ] --判断是不是目录
then
echo "yes"
else
echo "no"
fi
#2.判断Apache是否启动:
#!/bin/bash
test=$(ps aux | grep httpd | grep -v grep) #截取httpd进程,并把结果赋给变量test
if [-n "$test" ]
then #如果test的值不为空,则执行then命令
echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
else
echo "$(date) restart httpd !!" >> /tmp/autostart-err.log
/etc/rc.d/init.d/httped start #httpd开启命令(service httpd start是简化命令,在Shell脚本中不能使用!!)
fi
Linux之多分支if语句的学习:
Linux之sed命令的学习博客参考:(linux之sed用法):http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html
sed 's/[0-9]//g' //将数值替换为空
Linux之for循环语句的学习:
for i in 1 2 3
do
echo $i #依次输出1 2 3
done