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/bash

bash和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+2

2.变量的分类
环境变量(全局变量)系统默认存在。对所有父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
18

shell 状态变量:
$? 获取上一条命令的执行结果,0为成功 非0为失败
[root@web01 day01]# cat test.sh 
#!/bin/bash
ping -c1 -w1 $1 &>/dev/null
[ $? -eq 0 ]&& echo "$1 通" || echo "$1 不通"

$$ #获取脚本PID号

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

atomLg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值