掌握Shell:从新手到编程大师的Linux之旅

news2025/1/19 20:34:49

1 shell介绍

1.1 shell脚本的意义

1.记录命令执行的过程和执行逻辑,以便以后重复执行
2.脚本可以批量处理主机
3.脚本可以定时处理主机

1.2 脚本的创建

#!/bin/bash # 运行脚本时候执行的环境

在这里插入图片描述

在这里插入图片描述

1.3 自动添加脚本说明信息

/etc/vimrc # vim主配置文件
~/.vimrc # 该用户环境下的文件
autocmd BufNewFile *.sh,*.script call NOTE()
func NOTE()
	call append(0,"####################")
	call append(1,"# Author: sxl")
	call append(2,"# Version: ")
	call append(3,"# Create_Time: ".strftime("%Y/%m/%d"))
	call append(4,"################################################")
	call append(5,"#!/bin/bash")
endfunc

在这里插入图片描述

1.4 执行shell脚本

当脚本没有可执行权限时候

1.4.1 手动在环境中开启指定解释器

sh script.sh

在这里插入图片描述

1.4.2 直接在当前环境中运行shell中的指令不开启新的shell

source script.sh
. script.sh

在这里插入图片描述

当脚本有可执行权限时候

1.4.3 开启脚本中指定的shell并使用此shell环境运行脚本中的指令

chmod +x script.sh
/xxx/xxx/script.sh
./script.sh

在这里插入图片描述

1.5 调试

sh -x /mnt/westos.sh # 进入debug模式
+ ##运行指令
不带+ ##命令运行的输出

在这里插入图片描述

2 shell变量

2.1 变量的定义

  1. 变量就是内存一片区域的地址
  2. 变量定义的规范性

2.1.1 变量名称

可包含:
字母
下划线_
数字

不能用数字开头

建议:
变量名称短全用大写字符
变量名称长用_区分子类
WESTOS
Westos_Linux
westoS_Linux

2.2 不同级别的变量设定

2.2.1 环境变量

export a=1
在环境关闭后变量失效

在这里插入图片描述

2.2.2 用户级别

vim ~/.bash_profile
export a=1

在这里插入图片描述

2.2.3 系统级别

vim /etc/profile
export a=2
vim /etc/profile.d/westos.sh
export b=3

在这里插入图片描述
在这里插入图片描述

2.3 变量转义

2.3.1 转译

\ #转译单个字符
"" #弱引用,批量转译个数字符 不能转译"\ " "" "$" "!"
'' #强引用

在这里插入图片描述

2.3.2 声明变量及其引用

a=1
echo ${a}b

在这里插入图片描述

2.3.3 变量数组的使用

a=(1 2 3 4 5)
a$[a[@]:起始元素id:元素个数]
echo ${a[0]} ##数组中第一个元素
echo ${a[1]} ##数组中最后一个元素
echo ${a[*]} ##数组中所有元素
echo ${a[@]} ##数组中所有元素
echo ${a[@]:0:3} ##数组中13个元素
echo ${#a[@]} ##数组中元素的个数
unset a[n] ##删除数组中的第n1个元素
unset a ##删除a这个数组

在这里插入图片描述

2.4 命令的别名设定alias

alias xie='vim' ##临时设定
vim ~/.bashrc
alias xie='vim' ##只针对与用户生效
vim /etc/bashrc ##针对系统所以用户生效
alias xie='vim'
unalias xie ##删除当前环境中的alias

在这里插入图片描述

2.5 用户环境变量的更改

设定方式:
~/.bash_profile # 当前用户环境变量
export PATH=$PATH:/mnt
/etc/bash_profile # 整个系统变量
export PATH=$PATH:/mnt

在这里插入图片描述

2.6 直接利用命令执行结果

$()##优先执行
TIME=`date` # 范围更广

在这里插入图片描述

2.7 脚本中的传参

2.7.1 非交互式

非交互模式:
$0 is /mnt/test.sh <!脚本本身>
$1 is westos <!脚本后所输入的第一串字符>
$2 is linux
$3 is redhat
$* is westos linux redhat <!脚本后所输入的所有字符"westos linux redhat">
$@ is westos linux redhat <!脚本后所输入的所有字符'westos' 'linux' 'redhat'>
$# is 3 <!脚本后所输入的字符串个数>

在这里插入图片描述

2.7.2 交互式

read WESTOS ##对westos赋值
read -p "please input word:" ##输出提示语
-s ##隐藏输入内容

在这里插入图片描述

2.8 脚本函数

设定方式:
WORD()
{
action1
action2
}
WORD 在脚本中就代表action1 action2这两个动作

在这里插入图片描述
在这里插入图片描述

3 shell编程流程

3.1 for

for i in 1 2 3 4 5 sxl
do
	echo $i
done
echo "################"
for i in `seq 1 2 5` # 步长为2
do
         echo $i
done
echo "################"
for i in {1..5}
do
        echo $i
done
echo "################"
for ((i=6;i<10;i++))
do
         echo $i
done

在这里插入图片描述

在这里插入图片描述

3.2 条件

3.2.1 while do

在这里插入图片描述

3.2.2 until do

在这里插入图片描述

3.2.3 if

在这里插入图片描述

3.3 case

执行按钮操作,点名机制,相对于IF语句效率更高

case $1 in
word1|WORD1)
action1
;;
word2|WORD2)
action2
;;
*)
action3
esac

在这里插入图片描述

3.4 expect

3.4.1 shell应答方式

问题expect.sh

#!/bin/bash
read -p "what's your name:" NAME
read -p "How old are you: " AGE 
read -p "Which objective: " OBJ
read -p "Are you ok? " OK
echo $NAME is $AGE\'s old study $OBJ feel $OK

回答answer.sh

/root/Desktop/expect.sh <<EOF
SXL
20
REAHAT
OK
EOF

在这里插入图片描述
在这里插入图片描述

3.4.2 expect应答方式

dnf install expect -y
#!/usr/bin/expect
set timeout 1
set NAME [ lindex $argv 0 ]
set AGE [ lindex $argv 1 ]
set OBJ [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn /mnt/ask.sh
expect {
"name" { send "$NAME\r";exp_continue }
"old" { send "$AGE\r";exp_continue }
"objective" { send "$OBJ\r";exp_continue }
"ok" { send "$FEEL\r" }
}
expect eof

在这里插入图片描述

在这里插入图片描述

4 shell运算

4.1 运算符号

+ ##加法
- ##减法
* ##乘法
/ ##除法
% ##除法后的余数
** ##乘方
++ ##自加一
-- ##自减一
< ##小于
<= ##小于等与
> ##大于
>= ##大于等与
>= ##等于
+= j+=i ##j=j+i
*= *##j=j*i
/= ##j=j/i
%= ##j=j%i

在这里插入图片描述

4.2 运算指令

(()) ##((a=1+2))
let ##let a=1+2
expr ##expr 1 + 2
bc
bc << EOF
1+2
EOF
$[] ##echo $[1+2]
printf '%0.2f' .3 ==== 0.30
printf '%0.3f' .3 ====0.300
printf '%0.4f' .3 ====0.3000

在这里插入图片描述
在这里插入图片描述

5 脚本练习

5.1 IP采集

ifconfig $* | awk '/inet\>/{print $2}'

在这里插入图片描述

5.2 日志清理

[ "$USER" = "root" ]&&{
	echo clean ok
	> /var/log/message
}||{
	echo clean error
}

在这里插入图片描述

5.3 采集系统登录用户信息

echo -e "hostname:\t$(hostname)"
echo -e "hostname:\t$HOSTNAME"
echo -e "username:\t$USER"
IP=$(ifconfig ens160 | awk '/inet\>/{print $2}')
[ -z "$IP" ]&&{
    echo -e "ipaddress:\tNONE"
}||{
    echo -e "ipaddress:\t$IP"
}

在这里插入图片描述

5.4 脚本函数创建用户

ACTION()
{
    read -p "please name:" NAME
    [ "exit" = "$NAME" ]&&{
	exit
    }
    id $NAME &> /dev/null &&{
        echo "user exit"
        ACTION
    }||{
    echo "user not exit"
    read -p "please input passwd:" PASSWD
    adduser $NAME
    echo $PASSWD | passwd --stdin &> /dev/null &&{
	echo "$NAME create ok"
     }
    ACTION
    }
}
ACTION

在这里插入图片描述

5.5 检测直连网络中可以与主机通信的主机IP

for ip in {50..64}
do
	ping -w 1 -c 1 192.168.1.$ip &> /dev/null &&{
	echo 192.168.1.$ip
	}
done

在这里插入图片描述

5.6 用户建立脚本

5.7 系统CPU使用情况

ps ax -o %cpu | awk 'BEGIN{N=0}!/$CPU|0.0/{N+=$1}END{print "%CPU:\t"N"%"}'

在这里插入图片描述

5.8 倒计时

MIN=1
SEC=60
SECS=$[MIN*60+SEC]
for ((;SECS>0;SECS--))
do
	MIN=$[SECS/60]
	SEC=$[SECS%60]
	echo -ne "$MIN:$SEC"
	echo -ne '\r'
	sleep 1
done

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1224605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java之线程的概念及方法的学习

线程创建 方法一 直接使用Thread public class demo {public static void main(String[] args) {new Thread(){Overridepublic void run() {System.out.println(Thread.currentThread().getName());}}.start();System.out.println(Thread.currentThread().getName());} } main…

深信服AC应用控制技术

拓扑图 目录 拓扑图 一.上班时间不允许使用qq(假设上班时间是上午9到12&#xff0c;下午14到18) 1.新增上班时间不允许使用qq访问权限策略 2.将策略应用到组&#xff0c;例如修仙部 3.验证 上班时间发现登录不了 下班时间可以登录 二.上班时间不允许访问视频网站(假设上班时…

2023年优化算法之之霸王龙优化算法(TROA),原理公式详解,附matlab代码

霸王龙优化算法&#xff08;Tyrannosaurus optimization&#xff0c;TROA&#xff09;是一种新的仿生优化算法&#xff0c;该算法模拟霸王龙的狩猎行为&#xff0c;具有搜索速度快等优势。该成果于2023年发表在知名SCI期刊e-Prime-Advances in Electrical Engineering, Electro…

Go vs Rust:文件上传性能比较

在本文中&#xff0c;主要测试并比较了Go—Gin和Rust—Actix之间的多部分文件上传性能。 设置 所有测试都在配备16G内存的 MacBook Pro M1 上执行。 软件版本为&#xff1a; Go v1.20.5Rust v1.70.0 测试工具是一个基于 libcurl 并使用标准线程的自定义工具&#xff0c;能…

【双指针】复写0

复写0 1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上…

ZYNQ_project:LCD

模块框图&#xff1a; 时序图&#xff1a; 代码&#xff1a; /* // 24h000000 4324 9Mhz 480*272 // 24h800000 7084 33Mhz 800*480 // 24h008080 7016 50Mhz 1024*600 // 24h000080 4384 33Mhz 800*480 // 24h800080 1018 70Mhz 1280*800 */ module rd_id(i…

html网页设计 01基础标签

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body> <!-- 标题标签 h1最大 --><h1>最大标签</h1><h2>二级标签</h2><h3>三级标签</h3><…

JavaScript管理HTMLDOM元素(增删改查)

本文主要讲解JavaScript如何通过管理HTML上的DOM元素&#xff0c;其中包括如何查询、创建、修改以及删除具体功能和源码讲解。 增加 首先我们准备一个HTML框架和简单CSS样式&#xff0c;我对其中元素作用和关系进行一个简单说明。 <!DOCTYPE html> <html><he…

OpenCV C++ 图像 批处理 (批量调整尺寸、批量重命名)

文章目录 图像 批处理(调整尺寸、重命名)图像 批处理(调整尺寸、重命名) 拿着棋盘格,对着相机变换不同的方角度,采集十张以上(以10~20张为宜);或者棋盘格放到桌上,拿着相机从不同角度一通拍摄。 以棋盘格,第一个内焦点为坐标原点,便于计算世界坐标系下三维坐标; …

提升 Python 执行速度:Codon、C/C++、Rust、Numba(JIT)、Taichi、Nuitka、MatxScript

几种流行的 Python 性能加速方案对比&#xff1a;https://zhuanlan.zhihu.com/p/604519817 对于一般通用场景用户&#xff0c;对性能没有那么强烈的诉求&#xff0c;紧跟官方步伐&#xff0c;升级到最新版本的 Python 既可&#xff0c;或者使用 PyPy。Numba、Codon、Taichi 等这…

IoC DI

Spring 的两大核心思想 : IoC 和 AOP 我们要将对象的控制权交给Spring ,我们就需要告诉 Spring 哪些对象是需要帮我们进行创建的,这里有两类注解可以实现 : 类注解(Controller Service Repository Component Configuration)和方法注解(Bean) 这五大注解都表示把这个对象交给…

【MySQL】InnoDB和MyISAM区别详解(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

【Java】ArrayList和LinkedList使用不当,性能差距会如此之大!

文章目录 前言源码分析ArrayList基本属性初始化新增元素删除元素遍历元素 LinkedList实现类基本属性节点查询新增元素删除元素遍历元素 分析测试 前言 在面试的时候&#xff0c;经常会被问到几个问题&#xff1a; ArrayList和LinkedList的区别&#xff0c;相信大部分朋友都能回…

C++之set/multise容器

C之set/multise容器 set基本概念 set构造和赋值 #include <iostream> #include<set> using namespace std;void PrintfSet(set<int>&s) {for(set<int>::iterator it s.begin();it ! s.end();it){cout<<*it<<" ";}cout&l…

保姆级 | Nginx编译安装

0x00 前言 Nginx 是一个 HTTP 和反向代理服务器&#xff0c; 邮件代理服务器&#xff0c; 和通用 TCP/UDP 代理服务器&#xff0c; 最初由伊戈尔西索耶夫&#xff08;Igor Sysoev&#xff09;撰写。采用编译安装可以根据自身需要自定义配置&#xff0c;让服务器有更高的安全性和…

2023腾讯云轻量应用服务器购买优惠活动,轻量服务器优惠链接

双11优惠活动即将到来&#xff0c;各大电商平台纷纷推出超值优惠&#xff0c;腾讯云也不例外。今天&#xff0c;我将向大家介绍一款在双11活动中备受瞩目的服务器套餐——腾讯云的3年轻量应用服务器配置为2核2G4M带宽、50GB SSD系统盘。这款服务器不仅配置强大&#xff0c;而且…

Mac 安装 protobuf 和Android Studio 使用

1. 安装,执行命令 brew install protoc 2. Mac 错误提示&#xff1a;zsh: command not found: brew解决方法 解决方法&#xff1a;mac 安装homebrew&#xff0c; 用以下命令安装&#xff0c;序列号选择中科大&#xff08;1&#xff09;或 阿里云 /bin/zsh -c "$(curl…

Java Web——JavaScript基础

1. 引入方式 JavaScript程序不能独立运行&#xff0c;它需要被嵌入HTML中&#xff0c;然后浏览器才能执行 JavaScript 代码。 通过 script 标签将 JavaScript 代码引入到 HTML 中&#xff0c;有3种方式&#xff1a; 1.1. 内嵌式(嵌入式) 直接写在html文件里&#xff0c;用s…

Git命令总结-常用-后续使用频繁的再添加~

Git命令总结-常用 久了不用&#xff0c;有些时候老是会忘记一些命令&#xff0c;多的都记录一下&#xff0c;方便查找 git init 初始化一个Git仓库&#xff0c;执行完git init命令后&#xff0c;会生成一个**.git**目录&#xff0c;该目录包含了资源数据&#xff0c;且只会在…

如何解决swagger-editor在线接口调试时的跨域问题

文章目录 一&#xff0c;序言二&#xff0c;问题重现1. 运行swagger-editor2. 运行接口服务3. 问题重现步骤 三&#xff0c;解决问题思路1. 去除浏览器安全限制2. 服务器接口统一处理3. 委托nginx转发 四&#xff0c;完整接口代码传送 一&#xff0c;序言 在 Docker 运行swagg…