shell核心编程(一) 新手小白入门适合学~ 会持续更新哦~

本文介绍了Shell的基础知识,包括什么是Shell以及常见的解释器,如bash。详细讲解了如何修改用户的解释器,为什么选择bash作为默认解释器,并展示了如何编写和运行Shell脚本。此外,还探讨了变量的定义、调用、类型以及变量扩展应用,如不同引号的区别、read命令和全局/局部变量。最后,提到了Shell中的运算操作,并给出了几个综合案例,如硬件信息监控和数据计算。
摘要由CSDN通过智能技术生成

一、Shell基础

1、什么是shell?
shell是用户和Linux内核的解释器

2、常见的Shell解释器?
/bin/bash
/bin/sh
/bin/csh
/bin/tcsh
解释器负责将用户的指令翻译为内核可以识别的指令
通过usermod,chsh可以更改登录shell

3、修改用户的解释器

[root@localhost ~]# useradd test
[root@localhost ~]# grep test /etc/passwd
[root@localhost ~]# cat /etc/shells
[root@localhost ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
[root@localhost ~]# yum -y install csh tcsh		//安装新的解释器
[root@localhost ~]# usermod -s /bin/tcsh test 	//修改test用户的解释器
[root@localhost ~]# grep test /etc/passwd		//解释器已经修改

4、什么选择/bin/bash为我们默认的解释器?
支持快捷键,tab补齐
支持历史命令(history)
支持命令别名(alias)
支持标准输入和输出的重定向(> >> 2> 2>> &>)
支持管道( | )

[root@localhost ~]# ls >> a.txt
[root@localhost ~]# cat a.txt        //先创建a.txt文件,再去>重定向
[root@localhost ~]# ls xxxx > b.txt	 // >无法收集错误的信息,只能收集正确的
ls: cannot access xxxx: No such file or directory
[root@localhost ~]# ls xxxx 2> b.txt // 2> 可以收集错误的
[root@localhost ~]# ls xxx a.txt 	 //如果输出结果既有正确的,又有错误的呢?
ls: cannot access xxx: No such file or directory
a.txt
[root@localhost ~]# ls xxx a.txt &> c.txt   //&> 既可以收集错误的,也可以收集正确的
[root@localhost ~]# yum list | grep httpd	//管道过滤

5、临时修改ksh解释器

[root@localhost ~]# yum -y install ksh
[root@localhost ~]# ksh  //临时修改解释器
//exit返回bash解释器,ksh不支持ctrl+l,没有颜色(目录,快捷方式)

二、Shell脚本的设计与运行

1、什么是Shell脚本?
提前将可执行的命令语句写入一个文件
顺序执行
解释器逐行解释代码
//常见的脚本语言:Shell、PHP、JSP、Python、Perl、ruby脚本…

2、创建第一个Shell脚本
新建文件
添加可执行语句(命令)
给文件添加x执行权限

[root@localhost ~]# mkdir -p ~/shell/day01	 //创建一个day01的目录
[root@localhost ~]# vim shell/day01/first.sh //编辑第一个脚本
echo "hello world"
[root@localhost ~]# chmod +x shell/day01/first.sh //赋予可执行权限
[root@localhost ~]# /root/shell/day01/first.sh 	  //绝对路径执行(第一种方法)
hello world
[root@localhost ~]# cd /root/shell/day01/
[root@localhost day01]# ./first.sh 	//相对路径执行(第二种方法)
hello world

3、规范脚本的构成
#! 脚本声明(使用哪个解释器解释代码)
注释信息(步骤、思路、用途等),以#开始的为注释信息
可执行的语句

[root@localhost ~]# vim shell/day01/first.sh
#!/bin/bash
#This is my first shell
echo "hello world"

4、执行Shell脚本
方法一:需要为文件赋予可执行的权限
相对路径执行
绝对路径执行

方法二:不需要文件有可执行的权限
sh 脚本文件名 //不是去执行脚本,而是在执行脚本之前sh解释器就翻译了里面的内容
解释器本身就具备可执行权限,当它去读取一个没有可执行权限的文本的时候,但这个文本里面都是命令,它就可以自动的去执行
source 脚本文件名 //不会启动子进程,通过pstree查看进程树

[root@localhost ~]# cd shell/day01/		  //进入day01目录
[root@localhost day01]# chmod -x first.sh //把可执行权限去掉
[root@localhost day01]# ls -ld first.sh   //检查权限
-rw-r--r--. 1 root root 58 Sep 11 11:15 first.sh	
[root@localhost day01]# sh first.sh //用sh解释器去执行,不需要x权限
hello world
sh执行
[root@localhost day01]# sh tmp.sh	//用sh去执行
bash执行
[root@localhost day01]# bash tmp.sh	//用bash去执行
source执行
[root@localhost day01]# source tmp.sh //用source去执行
//sh和bash都会开启一个子进程,但是source不会开子进程,直接exit退出终端

三、变量

1、定义变量
什么是变量?
以固定的名称,存放可以能变化的值
定义变量的格式?
变量名=变量值
取消变量的格式?
unset 变量名

注意事项
=两边不能有空格,不要使用关键字做变量名,如cd,ls等
如果变量名已经存在则覆盖之前的变量值
变量名称有:数字/字母/下划线组成,不能以数字开始

2、调用变量

[root@localhost ~]# a=11		//定义变量
[root@localhost ~]# echo $a	  	//调用变量
11
[root@localhost ~]# a=33		//覆盖原来的值
[root@localhost ~]# echo $a		//调用变量
33	

3、设置变量的注意事项

[root@localhost ~]# a = 11		// =两边不能有空格
-bash: a: command not found
[root@localhost ~]# a)=22		// 不能有特殊符号
-bash: syntax error near unexpected XXXX `)'
[root@localhost ~]# 3a=33		//不能以数字开头
-bash: 3a=33: command not found
[root@localhost ~]# a_0=11		//由数字字母下划线组成

4、调用变量的注意事项

[root@localhost ~]# x=centos   //定义变量
[root@localhost ~]# echo $x	   //调用变量
centos
[root@localhost ~]# echo ${x}	 //调用变量
centos
[root@localhost ~]# echo $x6.5	 //因为变量名不可能是特殊符号. 
.5		   	
[root@localhost ~]# echo {$x}6.5 //{x}这样调用
{centos}6.5
[root@localhost ~]# unset x	//取消变量,脚本中定义的变量只在脚本允许的时候有效
[root@localhost ~]# echo $x

5、变量类型

环境变量(变量名通常大写,有操作系统维护)
位置变量(bash内 置变量,存储脚本执行时的参数)
预定义变量(bash内
内置变量,可以调用但是不能赋值或修改)
自定义变量(用户自主设置)

环境变量
存储在/etc/profile或~/.bash_profile
命令env可以列出所有的环境变量
常见环境变量:PATH PWD USER UID HOME SHELL HOSTNAME

[root@localhost ~]# echo $PATH	
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
//查看系统的命令路径,系统会在这$PATH变量中定义的目录下去找有没有这个命令
[root@localhost ~]# ls  	//一个一个找有没有ls
[root@localhost ~]# PATH=   //把PATH的值设置为空
[root@localhost ~]# ls	    //命令使用不了
-bash: ls: No such file or directory
[root@localhost ~]# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo $PWD	//列出当前位置
/root	
[root@localhost ~]# echo $USER	//列出登录当前系统的用户
root
[root@localhost ~]# echo $HOME	//列出当前系统的家目录
/root
[root@localhost ~]# echo $SHELL	//列出当前的解释器程序
/bin/bash
[root@localhost ~]# echo $PS1	//显示当前[root@localhost ~]格式
[\u@\h \W]\$
[root@localhost ~]# echo $PS2	//显示\什么时候执行,换行
>
[root@localhost ~]# which ls
/usr/bin/ls
[root@localhost ~]# env		//查看所有的环境变量
[root@localhost ~]# set | grep abc	//过滤设置的变量

位置变量
存储脚本执行时的参数
使用$n表示,n为数字序列号
$1 $2 … ${10} ${11} …

[root@localhost day01]# vim vars.sh		//编辑位置变量脚本
#!/bin/bash
echo $1
echo $2
echo $3
[root@localhost day01]# chmod +x vars.sh	//赋予x权限
[root@localhost day01]# ./vars.sh aa bb cc	//aa是$1 bb是$2 cc是$3
aa
bb
cc
[root@localhost day01]# vim user.sh		//创建用户,设置密码
#!/bin/bash
useradd $1
echo $2 | passwd --stdin $1
[root@localhost day01]# chmod +x user.sh	//赋予x权限
[root@localhost day01]# ./user.sh  tom  123	//tom是$1 123是$2

[root@localhost day01]# grep tom /etc/passwd//tom用户确实创建成功啦
tom:x:1002:1002::/home/tom:/bin/bash

预定义变量
用来保存脚本程序的执行信息
直接使用这些变量
不能直接为这些变量赋值
$0 当前所在的进程或脚本名
$$ 当前运行进程的PID号
$? 命令执行后的返回状态,0表示正常,1或其他值表示异常
$# 已加载的位置变量的个数
$* 所有位置变量的值

[root@localhost day01]# ls /etc/hosts	//执行结果是成功
/etc/hosts
[root@localhost day01]# echo $?
0
[root@localhost day01]# ls /xxxxx	//执行结果是失败
ls: cannot access /xxxxx: No such file or directory
[root@localhost day01]# echo $?
2
[root@localhost day01]# vim pre.sh
[root@localhost day01]# chmod +x pre.sh
#!/bin/bash
echo $0
echo $$
echo $#
echo $*
[root@localhost day01]# ./pre.sh aa 88 cc 33
./pre.sh		//脚本名字
34372		    //脚本PID
4		        //位置变量个数
aa 88 cc 33	    //位置变量的值

四、变量的扩展应用

1、各种引号的区别
双引号:“” 允许扩展,以$引用其他变量

单引号:‘’ 禁止扩展,即便$也视为普通字符

反引号:`` 将命令的执行输出作为变量值,$()与反引号等效

双引号&单引号

[root@localhost ~]# touch a b c	//创建3个文件
[root@localhost ~]# touch "a b c"	//创建1个文件
[root@localhost ~]# a=11
[root@localhost ~]# echo "$a"
[root@localhost ~]# echo '$a'
[root@localhost ~]# echo "$USER id is $UID"
[root@localhost ~]# echo '$USER id is $UID'
[root@localhost ~]# grep root /etc/passwd

反引号

[root@localhost ~]# test=`grep root /etc/passwd`
[root@localhost ~]# echo $test
[root@localhost ~]# test2=$(grep root /etc/passwd)
[root@localhost ~]# echo $test2

2、read命令定义变量
从键盘读入变量值完成赋值
格式:read [ -p “提示信息”] 变量名
-p可选
-t可指定超时秒速
-s设置是否在终端显示输入内容

[root@localhost ~]# read iname	//给iname赋值
[root@localhost ~]# echo $iname				
[root@localhost ~]# read -p "请输入用户名:" iname	//-p 选项,有提示信息
请输入用户名:dachui
[root@localhost day01]# vim  read.sh 
#!/bin/bash
read -p "请输入用户名:" name
read -p "请输入密码:" -s pass	//-s 密码不显示出来 
useradd $name
echo $pass | passwd --stdin $name
[root@localhost day01]# chmood +x  read.sh
[root@localhost day01]# read -t 3 name

3、全局 or 局部
局部变量
新定义的变量默认只能在当前shell环境中有效,无法在子Shell环境中使用
全局变量
全局变量在当前的Shell及子Shell环境中均有效

[root@localhost ~]# x=11
[root@localhost ~]# bash
[root@localhost ~]# echo $x
[root@localhost ~]# export y=22		//全局设置
[root@localhost ~]# bash
[root@localhost ~]# echo $y
22

五、Shell中的运算

整数运算
变量自增/减操作
小数运算
数字的比较
1、整数运算
加法 num1 + num2
减法 num1 - num2
乘法 num1 * num2
除法 num1 / num2
取余 num1 % num2
使用$[] 或者 ( ( ) ) 表达式格式: (())表达式 格式: (())表达式格式:[整数1 运算符 整数2…]
计算结果替换表格式本身,可结合echo命令输出

2、变量的自增/减等操作
//let也可以运算,但是不会直接显示出来,需要echo调用

3、小数运算

root@localhost ~]# echo $[1.1+2.2]		//报错,不能算小数
-bash: 1.1+2.2: syntax error: invalid arithmetic operator (error token is ".1+2.2")
[root@localhost ~]# yum -y install bc	
//使用bc可以运算小数,scale指定小数位,quit退出
//bc命令行用法,;代表多个
但是scale只对除法、取余、乘幂有效,比如乘法就无效可以除以1
[root@mysql ~]# echo "scale=2;(1.111+2.222)/1" | bc
3.33

4、数字的比较
bc支持的比较操作符:> >= < <= == !=
表达式成立则返回1,否则返回0

六、综合案例

echo回显
监控硬件信息
数据计算
自动配置Yum源

1、echo回显
1)-n 不换行
2)-e 扩展属性 30多是字体颜色,40多是底色
// [0m代表结束,如果没写,整个字体颜色都会改变

#!/bin/bash
for ((i=30;i<38;i++))
  do
    echo -e "\033["$i"mI Love You\033[0m" 
sleep 0.5
done
for ((i=40;i<48;i++))
  do
    echo -e "\033["$i"mI Love You\033[0m" 
sleep 0.5
done

2、监控硬件信息

[root@localhost day01]# vim info.sh 
#!/bin/bash
echo -e "\033[32m网卡\033[0m"
ifconfig ens33 | grep "inet "
echo -e "\033[33m内存\033[0m"
grep MemAvailable /proc/meminfo
echo -e "\033[34m磁盘\033[0m"
df -h /
echo -e "\033[35mCPU\033[0m"
grep "model name" /proc/cpuinfo
[root@localhost day01]# chmod +x info.sh

3、数据计算(1+2+3…的和)

[root@localhost day01]# vim calc.sh
#!/bin/bash
read -p "请输入一个正整数:" num
sum=$[num*(num+1)/2]
echo -e "\033[32m$num内整数的和是$sum\033[0m"
[root@localhost day01]# chmod +x calc.sh
[root@localhost day01]# ./calc.sh 
请输入一个正整数:100
100内整数的和是5050

4、梯形面积、圆形面积
//r^代表多个次幂

#!/bin/bash
#梯形面积:(上底边长+下底边长)*高/2
read -p "上底:" a
read -p "下底:" b
read -p "高:" h
A=$(echo "($a+$b)*$h/2" |bc)
echo -e "\033[32m梯形面积是:$A\033[0m"
#圆形面积:πr2,π=3.14
read -p "半径:" r
A=$(echo "3.14*$r^2" |bc)
echo -e "\033[32m圆的面积是:$A\033[0m"

5、配置Yum源脚本

[root@localhost day01]# vim yum.sh
#!/bin/bash
url=file:///mnt
echo "[centos]
name=centos
baseurl=$url
gpgcheck=0" > /etc/yum.repos.d/el7.repo
[root@localhost day01]# chmod +x yum.sh
[root@localhost day01]# ./yum.sh 

加油ヾ(◍°∇°◍)ノ゙,人一旦懒惰太久,上天就会收走你本有的天赋,每天坚持学习,让自己充实起来

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值