shell编程-核心变量知识
文章目录
- shell简介
- 如何学好shell
- 初识shell
- 什么是shell
- 执行shell脚本常用的三种方式
- shell变量
- 变量相关的配置文件
- 变量的定义
- shell核心位置变量
shell简介
为什么学习shell,shell的作用
面试题:给你一台主机你的操作流程是什么?
1.自动化安装操作系统kickstart cobbler
2.优化操作系统系统层面 关闭selinux 关闭不用的服务 优化ssh 禁止ROOT登录 加大文件描述符 定时任务 修改默认仓库 内核参数优化安全层面 禁用ROOT jumpserver iptables 优化 禁止显示操作系统版本号
3.安装服务NGINX NFS rsync Tomcat httpd zabbix iptables jumpserver
4.部署代码 代码更新
5.服务监控 zabbix 自定义监控
6.日志分析 IP访问量 日志切割
7.其他 定时任务+shell脚本
统计nginx日志中客户端访问的top10
shell串联
如何学好shell
1.shell 执行方式
2.shell变量
3.shell表达式
4.if判断
5.for循环
6.while循环
7.函数
8.流程控制语句
9.expect
10.数组···01.掌握变量和表达式
02.读写理解老师的脚本
03.自己尝试书写脚本(先照着写-熟练-不看笔记自己写-修改 打补丁多练习)
04.形成自己的风格
05.切忌拿来即用
06.最好有一本内容比较全面的书籍《跟老男孩学习shell》案例较多。
初识shell
1.脚本的结尾使用.sh
2.脚本开头使用#!/bin/bash
3.脚本中尽量有作者信息
4.脚本中尽量有注释信息
5.脚本中尽量使用英文注释
6.成对的符号一次书写完
注意shell中的符号都是英文字符
什么是shell
shell 是命令解释器,负责解释用户输入命令传递给内核,内核执行调用硬件,然后将结果返回给shell
交互式:和人交互
非交互式:不和人交互 类似定时任务
什么是shell脚本
将命令写入到文件中,称为shell脚本,增加了判断 循环 函数等语法
创建shell脚本
Linux系统默认的shell为:bash[root@web01 day01]# echo $SHELL
/bin/bashbash和sh的区别:没区别[root@web01 day01]# cat test.sh #脚本名称:见名知其义
#!/bin/bash #指定解析器
echo "hello world" #输出内容到屏幕
执行shell脚本常用的三种方式
第一种方式:
sh test.sh第二种方式:路径的执行方式:脚本需要有x权限绝对路径:[root@web01 day01]# chmod +x test.sh[root@web01 day01]# /scripts/shell/day01/test.sh hello world相对路径:[root@web01 day01]# ./test.sh hello world第三种执行脚本方式:[root@web01 day01]# . test.sh
hello world
[root@web01 day01]# source test.sh
hello world三种脚本执行方式的区别:
第一、二种方式是在子shell中执行
第三种方式是在父shell中执行解释器分为父shell 和子shell
父shell:登录系统默认为父shell
子shell:在默认的父shell中执行bash 进入到了一个子shell中在执行脚本的时候,调用子shell执行内容
shell变量
1.什么是变量
用一个固定的值表示一堆不固定的值,称为变量
比如:dir=/etc/sysconfig/network-scriptes
x=1 y=x+22.变量的分类
环境变量(全局变量)系统默认存在。对所有父shell和子shell生效
普通变量(局部变量)自定义变量。只对当前的shell生效3.按照变量的生存周期
临时变量:直接定义或者使用export定义的变量
永久变量:写入到文件中或者/etc/profile便令文件中直接定义: name=oldboy #只对当前的shell生效
使用export:export name=oldboy #对当前父shell下的所有的shell生效
变量相关的配置文件
/etc/profile #常用的变量配置文件。每次开机和每次的远程连接都会执行此文件
/root/.bash_profile
/root/.bashrc
/etc/bashrc
变量的定义
名称的定义:name=oldboy
名称的定义规范:由字母、数字、下划线组成。不能由数字开头。可以用字母和下划线开头。等号(=)两边不能有空格。
名称:全大写 全小写 驼峰命名法
name_age
NAME_AGE #系统默认的变量全是大写 env
Name_Age #大驼峰
name_Age #小驼峰变量值的定义:
1.字符串定义:不连续的使用""引起来
[root@web01 ~]# dir=/etc/sysconfig/network-scripts/
[root@web01 ~]# echo $dir
/etc/sysconfig/network-scripts/[root@web01 ~]# test="1 2 3 4"
[root@web01 ~]# echo $test
案例:
定义路径:dir=/etc/sysconfig/network-scripts/
code=/var/nginx/html定义文件:
file1=/etc/passwd file2=/etc/hosts定义命令:
[root@web01 ~]# hehe='touch /tmp/hehe.txt'
[root@web01 ~]# $hehe[root@web01 ~]# vim_eth0='vim /etc/sysconfig/network-scripts/ifcfg-eth0'
[root@web01 ~]# $vim_eth0
====================================================================2.数字定义:
age=18
age="1 124 34"3.命令定义:``或者$().先执行``中的命令,然后将执行的结果赋值给变量
[root@web01 ~]# count=`cat /etc/passwd |wc -l`
[root@web01 ~]# echo $count
28
[root@web01 ~]# count=$(cat /etc/passwd |wc -l)
[root@web01 ~]# echo $count
28案例:定义一个变量,在脚本的任意位置执行nginx -t命令
[root@web01 ~]# nginx_n='nginx -t'
[root@web01 ~]# $nginx_n
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful案例:时间
脚本中执行变量每次时间为当前的执行时间[root@web01 ~]# Time='date +%F-%H-%M-%S'[root@web01 ~]# $Time
2024-06-02-21-49-23脚本中执行的时间变量为固定的时间
[root@web01 ~]# Time=`date +%F-%H-%M-%S`
[root@web01 ~]# echo $Time
2024-06-02-21-48-02[root@web01 ~]# Ip=`hostname -I |awk '{print $1}'`
[root@web01 ~]# echo $Ip
10.0.0.7
[root@web01 ~]# Host=`hostname`
[root@web01 ~]# echo $Host
web01
[root@web01 ~]# echo "${Ip}_$Host"
10.0.0.7_web01
shell核心位置变量
$0 #获取shell脚本的文件名称
$n #$1表示脚本的第一个参数 $2表示脚本的第二个参数[root@web01 day01]# sh test.sh {a..z}
a b c d e f g h i j k
[root@web01 day01]# cat test.sh
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11}basename /scripts/shell/day01/test.sh #取最后一个参数$# #获取脚本传参的个数
案例:
[root@web01 day01]# cat test.sh
#!/bin/bash
[ $# -ne 2 ]&& echo "请输入两个参数"&& exit
echo "name: $1"
echo "age: $2"$* #获取脚本传参的所有参数,默认和$@相同。在循环体中加双引号表示一个整体
$@ #获取脚本传参的所有参数,默认和$*相同。在循环体中加双引号表示独立的参数[root@web01 day01]# set -- "I am" oldboy I am 18
[root@web01 day01]# for i in $*; do echo $i; done
I
am
oldboy
I
am
18
[root@web01 day01]#
[root@web01 day01]# for i in $@; do echo $i; done
I
am
oldboy
I
am
18
[root@web01 day01]#
[root@web01 day01]# for i in "$*"; do echo $i; done
I am oldboy I am 18
[root@web01 day01]#
[root@web01 day01]# for i in "$@"; do echo $i; done
I am
oldboy
I
am
18shell 状态变量:
$? 获取上一条命令的执行结果,0为成功 非0为失败
[root@web01 day01]# cat test.sh
#!/bin/bash
ping -c1 -w1 $1 &>/dev/null
[ $? -eq 0 ]&& echo "$1 通" || echo "$1 不通"$$ #获取脚本PID号