当前位置: 首页 > news >正文

Shell编程入门指南

1、Shell简介

Shell是一个用C语言编写的程序,通过Shell用户可以访问操作系统内核服务。Shell类似于DOS下的command和后来的cmd.exe。Shell既是一种命令语言,又是一种程序设计语言。Shell script是一种为shell编写的脚本程序。

2、Shell作用

(1)Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。

(2)shell脚本就是把原来 linux 命令或语句放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为 shell 脚本或 shell 程序;我们可以在脚本中输入一系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们有机结合起来就形成了一个功能强大的 shell 脚本。

(3)shell脚本作用

   ①自动化完成软件的安装部署,如安装部署LAMP架构服务
②自动化完成系统的管理,如批量添加用户
③自动化完成备份,如数据库定时备份
④自动化的分析处理,如网站访问量

(4)shell脚本的使用场景

       在需要完成大量复杂、重复性的工作时,不需要在命令行重复执行命令,直接运行shell脚本即可,大大的节省了时间提高了效率

3、Shell脚本入门

创建程序(脚本)的步骤① 创建一个包含命令语句  后期 在加上  控制结构② 修改你创建的文件权限    chmod + x 0805.shell③ 运行 检查脚本语法是否错误④ 执行 脚本   ./0805.sh

3.1 编写shell脚本

使用vim编辑器新建一个hello.sh文件(扩展名并不影响脚本执行)

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell给shell程序赋予执行权限:
chmod +x ./hello.sh # 使脚本具有执行权限

3.2 执行shell脚本

执行shell程序 提前:给shell程序授予可执行权限第一种: ./xxx.sh 在当前目录中执行shell程序
第二种: /xx/xxx.sh 书写全路径的shell程序
第三种: sh /xx/xxx.sh 把shell程序作用/bin/sh解释器的参数,通过运
行解释器来执行shell

4、Shell的基本组成

一个程序的基本组成:

1. 变量

2. 数据类型

3. 运算符号

4. 流程控制语句(默认:程序是按照从上向下依次执行)

5. 数组

6. 函数(另一个名字:方法)

5、Shell程序:变量

5.1 语法格式

变量的语法: 变量名=值
# 变量的名字是由写程序的人自主定义的。通常在shell定义格式为: 一个小写字母单词、 
多个单词组成时每个单词之间使用"_"分隔
your_name="bigdata.com" # 通常开发中命名惯例: 见名知其意例:name、gender、
student_name注意:等号两边不能有空格,同时变量名的命名须遵循如下规则:
(1)首个字符必须为字母( a-z, A-Z)
(2)中间不能有空格,可以使用下划线( _)
(3)不能使用标点符号
(4)不能使用 bash 里的关键字(可用 help 命令查看保留关键字)

5.2 变量的使用

使用一个定义过的变量,只要在变量名前加$即可。花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的 边界。已定义的变量可以被重新定义。

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改 变。

readonly 变量名=值使用 unset 命令可以删除变量。 不能删除只读变量。
只读变量不能修改

小结:

变量的定义: 变量名=初始值 等号两边不能有空格
变量的使用: $变量名 或 ${变量名}
修改变量中的值: 变量名=新的值 针对普通变量
只读变量: readonly 变量名=初始值 只读变量在初始化后不能修改初始
值,只读变量不能被删除
删除变量(只能删除普通变量): unset 变量名

5.3 变量类型

变量的类型可以分为:局部变量、全局变量

局部变量:局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其 他 shell 启动的程序不能访问局部变量。

全局变量(环境变量):所有的程序,包括shell启动的程序,都能访问环境 变量,有些程序需要环境变量来保证其正常运行。可以用过 set 命令查看当 前环境变量。

6、 字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没 啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不 用引号。

6.1 单引号

单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不
行),但可成对出现,作为字符串拼接使用

6.2 双引号

双引号里可以有变量
双引号里可以出现转义字符

6.3 获取字符串长度

${#字符串}    #字符串的长度   包括空格

6.4 提取字符串

提取字符串 ${字符串:索引}  #从0开始计数 索引从开始计算到最后ni hao012345${字符串:索引:n} #从索引开始截取n个注意:当字符串中有空格时,空格也算一个字符存在(字符串是从0开始计算)

6.5 查找字符串

`expr index 字符串 子字符串`注意: 以上脚本中 ` 是反引号(Esc下面的),而不是单引号 ',从1开始计算位置。expr 是以单个字符查找 如果中间有重复字母会显示前面字符的索引

7、Shell程序:参数传递

7.1 参数传递方式

传递参数的方式:sh test1.sh(shell程序)  参数1   参数2  参数3   参数n
$0 表示当前脚本名称

7.2 特殊字符

shell程序中的特殊字符:$*   作为一个完整的字符串$@   参数的列表$#   参数的个数$?   查看上一个命令是否正确$$   当前脚本运行的进程ID$!   后台运行的最后一个进程ID

7.3 $*he $@的区别

相同点: 都表示传递给脚本的所有参数。不同点: 
不被" "包含时:$*和$@都以$1 $2… $n 的形式组成参数列表
被"	"包含时:*"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n" 的形式组成一个整串"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式组成一个参数列表

8、shell程序:运算符

8.1 运算符的基本使用

Shell和其他编程语言一样,支持包括:算术、关系、逻辑、字符串等运算符。原生/bin/bash不支持简单的数学运算,但是可以通过其他命令来实现,例如:expr。

expr是一款表达式计算工具,使用它能完成表达式的求实操作。

1、运算数和运算符之间要有空格。例如: 2+2 是不能运算的,必须写成2 + 2
2、完整的表达式要被`符号包含,注意不是单引号,在 Esc 键下边加(+) 减(-) 乘(*) 除(/) 取余(%)   注: * 在系统中是代表所有  ,所以这边需要转义符(\)进行转成普通字符

示例:求和

#!/bin/bashread -p "输入参数1:" num1
read -p "输入参数2:" num2
sum=`expr $num1 + $num2`echo "求和结果:" $sum

8.2 关系运算符

注意:关系运算符只支持数字,不支持字符串,除非字符串的值是数字。数字的关系运算符: > >= < <= != ==运算符 含义
-eq 检测两个数是否相等,相等返回 true
-ne 检测两个数是否不相等,不相等返回 true
-lt 小于 应用于:整型比较。 例: 10 lt 5
-gt 检测左边的数是否大于右边的,如果是,则返回 true
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较

8.3 逻辑运算符

&&:逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为0(结
果成立)。使用 test命令测试时,“&&”可改为“-a”。||:逻辑或,表示“或者”,只要前后两个条件中有一个成立,整个测试命令的返回值即为0
(结果成立)。使用 test 命令测试时,“||”可改为“-o”。!:逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为 0(结果成立)。

8.4 字符串运算符

运算符 含义
-n STRING 字符串长度不为零 (非空字符串)
-z STRING 字符串长度为0(空字符串)= 判断两个字符串是否一样
!= 判断两个字符串是否不一样

示例1:判断字符串是否为空

#!/bin/bash
read -p "输入字符串;" str
if [ -n "$str" ];then
echo "字符串非空"
else
echo "字符串为空"
fi

示例2:判断字符串是否一样

示例3:判断前系统的语言环境是否不是 "en.US",如果不是则输出 "NOT en.US"

示例4:检查当前登录系统的用户数量,如果用户数大于等于 5,则输出 "用户太多"。

8.5 文件测试运算符

运算符号        含义                   示例-f        存在且是普通文件       [ -f 文件路径 ]-d        存在且是目录           [ -d 目录路径 ]-s        文件不为空             [ -s 文件路径 ]-e        文件存在              [ -e 文件路径 ]-r        文件存在并且可读       [ -r 文件路径 ]-w        文件存在并且可写       [ -w 文件路径 ]-x        文件存在并且可执行     [ -x 文件路径 ]

9、流程控制

任何程序都有默认的执行流程,通常是从上向下逐行依次执行。
选择:有选择性的执行某行或某段程序
重复:一直重复性的执行某行或某段程序,至到执行结束(条件控制循 环执行的次数)

9.1 if...else

9.1.1格式1 单支

if [ 条件 ]; then
命令…
fi执行机制:判断一次,仅有一个结果
条件成立(true):执行命令
条件失败(false):没有任何执行

示例1:查询是否有 /mnt目录

#!/bin/bash
if ls /mnt
then echo "mnt目录存在"
Fi

示例2:判断num1是否大于num2

#!/bin/bash
num1=$1
num2=$2
if [ $num1 -gt $num2 ]; then
echo "num1大于num2"
fi

9.1.2 格式2 双支

if [ 条件 ]; then命令1…
else命令2…
fi执行机制:判断一次条件,有两个不同结果
条件成立(true):执行 then 后面的代码(命令1)
条件失败(false):执行 else 后面的代码(命令2)

示例1:判断当前登录用户是不是root用户

#!/bin/bash
if [ $UID -eq 0 ]; thenecho "当前登录用户为root用户"
elseecho "当前登录用户为非root用户"
fi

示例2:查看目录是否存在

#!/bin/bash
read -p "请输入目录" str
if ls $str > /dev/null ; then
echo "目录存在"
else
echo "目录不存在"
fi

示例3:输入两个数字判断大小

#!/bin/bash
num1=$1
num2=$2
if [ $num1 -gt $num2 ]; then
echo " num1大于num2"
else
echo "num1小于num2"
fi

示例4:查看ip能否ping通

#!/bin/bash
read -p "输入ip地址:" ip
ping -c 2 -i 0.2 -w 3 $ip &> /dev/null
if [ $? -eq 0 ]; then
echo "$ip is up"
else echo "$ip is down"
fi

示例5:查看80端口是否开启,若未开启,启动服务


#!/bin/bash
if netstat -antult |grep ":80" > /dev/null 2>&1;thenecho "80端口服务已运行!"
elseif [$? -eq 0]; thenecho "web网站服务已经运行了!"elseecho "启动http服务"yum install -y httpd > /dev/nullsystemctl restart httpdfi        
fi         

示例6:查看用户是否存在,不存在创建新用户并设置密码123456

#!/bin/bash
read -p "请输入用户名:" name
id $name &> /dev/null
if [ $? -eq 0 ]; thenecho "用户存在"
elseuseradd $nameecho "123456" | passwd --stdin $name && echo "用户创建成功"
fi

9.1.3 格式3 多支

if [ 条件1 ]; then命令1…
elif [ 条件2 ]; then命令2
......elif
else默认命令…
fi执行机制:有多个判断条件,每个判断条件对应一个结果;如果所有的判断条件
都不成立,则执行else后面的默认结果
当第1个判断条件就成立了,会执行命令1。后续其他的判断条件都不会再执行了

示例1:输入成绩判断90-100优秀,80-89良好,60-79及格,60分以下不及格。

#!/bin/bash
read -p "请输入成绩" score
if [ $score -ge 90 ]; thenecho "优秀"
elif [ $score -ge 80 ]; thenecho "良好"
elif [ $score -ge 60 ]; thenecho "及格"
else echo "不及格"
fi

示例2:判断文件类型

#!/bin/bash
read -p "请输入文件路径" str
if [ -d $str ]; thenecho "这是一个目录"
elif [ -f $str ]; thenecho "这是一个文件"
elif [ -b $str ]; thenecho "这是一个设备文件"
else echo "无法识别文件类型"
fi

示例3:根据当前时间,判断时间段

#!/bin/bash
time=$(date +%H)
if [ $time -ge 6 -a $time -lt 10 ]; thenecho "现在是早上$time点"
elif [ $time -ge 10 -a $time -lt 14 ]; thenecho "现在是中午$time点"
elif [ $time -ge 14 -a $time -lt 18 ]; thenecho "现在是下午$time点"
elif [ $time -ge 18 -a $time -lt 24 ]; thenecho "现在是晚上$time点"
elseecho "现在是凌晨$time点"
fi

9.2 for

循环流程控制:程序在执行时重复性的执行某行或某段代码。
不能出现死循环现象(在循环中添加条件用于在某个时刻结束循环)
一个简单的循环必须具备:
1. 循环初始值
2. 循环条件
3. 修改循环条件方式一:从指定的起始值开始循环,至到循环上限结束
for((循环初始值; 循环条件; 修改循环条件))
do
循环体代码(会重复执行的程序代码)
done方式二:从一些数据集中,依次取出每一个数据进行操作,至到从数据集中取完所有数据
for 变量名 in 数据1 数据2 数据3 ....
do
程序代码
done
================================================
for 变量名 in 数组
do
程序代码(循环体代码)
done

示例1:实现打印5次hello world

#!/bin/bash
for((i=0;i<5;i++))
doecho "$i - hello world"
done

示例2:求10以内数值累加的和

#!/bin/bash
count=0
for((i=1;i<=10;i++))
docount=$(($count+$i));
doneecho "求和值为$count"

示例3:给一个IP地址的文件(ipddr.txt)需要 ping 文件中的IP(主机)判断是否能通


#!/bin/bash
IP_Addr=$(</root/IP_Addr.txt)
for ip in $IP_Addr;
do
ping -c 2 -i 0.5 -w 3 $ip &> /dev/null
if [ $? -eq 0 ];thenecho "连通ip:$ip"
elseecho "不通ip:$ip"
fi
done

示例4:统计 /var/log 有多少个文件,并且显示这些文件名

#!/bin/bash
cd /var/log
sum=0
for file in $(ls);
do
if [ -f $file ]; thenlet sum++echo "$file"
fi
done
echo "文件总数:$sum"

示例5:需要ping 通 某个网段  机器  并且 输出 通和不通 反馈结果

#!/bin/bash
read -p "请输入要查询的网段地址(示例:192.168.1):" ip
echo "正在查询$ip.0/24网段"
echo "================================="
for ((i=1;i<20;i++));
do
{  IP=${ip}.${i}ping -c 2 -i 0.2 -w 3 $IP &> /dev/nullif [ $? -eq 0  ]; thenecho "主机$IP能ping通"echo $IP >> /opt/0805/ipup.txtelse echo "主机$IP不通"echo $IP >> /opt/0805/ipdown.txtfi
}&
done
wait
up_count=$(wc -l < "/opt/0805/ipup.txt")
down_count=$(wc -l < "/opt/0805/ipdown.txt")
echo "统计完成,共有$up_count个ip通"
echo "统计完成,共有$down_count个ip不通"
echo "已经详细信息存储在 /opt/0805/ipup.txt和 /opt/0805/ipdown.txt中"

示例6:九九乘法表

#!/bin/bash
for i in $(seq 9);dofor j in $(seq $i);doecho -n "$i*$j=$[$i*$j] "
done
echo
done

示例7:随机生成密码

#!/bin/bash
key="123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*"
num=${#key}
for i in {1..15}
do
index=$[RANDOM%num]
passwd=$passwd${key:$index:1}
done
echo "生成密码为:$passwd"

9.3 while

方式一:
while [ expression ]
docommand…修改while中的循环条件
done方式二:
i=1
while((i<=3))
doecho $ilet i++ # (($i++))
donelet命令是BASH中用于计算的工具,用于执行一个或多个表达式,变
量计算中不需要加上$来表示变量。
自加操作: let no++
自减操作: let no--方式三:无限死循环
while true
docommand
done

示例1:输入yes/YES停止循环

#!/bin/bash
while [ "$y" != "yes" -a "$y" != "YES" ]
doecho "请输入yes/YES停止循环"read y
done
echo "循环停止"

示例2:输出1~3

#!/bin/bash
i=1
while ((i<=3)); doecho $ilet i++
done

示例3:10以内数字求和

#!/bin/bash
i=1
sum=0
while (($i<=10))
dosum=$[$sum+$i]let i++
done
echo "求和结果为:$sum"

示例4:监控某个服务  httpd/nginx/mysql 运行状态

#!/bin/bash
while ps -aux|grep httpd|grep -v grep &> /dev/null
doecho "httpd服务正在运行中"sleep 2
done
echo "httpd服务未开启"

9.4 case

格式:
case $变量名称 in匹配模式1 )
程序段
;; # 匹配模式1执行完毕匹配模式2 )
程序段
;;* ) # 默认值,没有匹配的模式
程序段
;;esac # 代表case语句结束

示例1:case的使用

#!/bin/bash
case $1 in
"hello")echo "hello world !";;
"test")echo "testing......";;
"")echo "$0 没有参数";;
*)echo "默认";;
esac

示例2:服务启动脚本

#!/bin/bash
case $1 in
"start")systemctl start httpdecho "启动服务"
;;
"stop")systemctl stop httpdecho "关闭服务" 
;;
"restart")systemctl restart httpdecho "服务已重启" 
;;
*)echo "请输入正确命令:{strst|stop|restart}"
esac

示例3:使用case编写一个查看cpu、内存、硬盘资源使用情况的脚本

#!/bin/bash
echo "请输入要查询的设备:"
echo "1、cpu"
echo "2、内存"
echo "3、硬盘"
read -p "请输入查询设备" name
case $name in
"1")echo "正在查询cpu资源情况"echo "=========================="top -bn1|grep "%Cpu(s)"
;;
"2")echo "正在查询内存资源情况"echo "=========================="free -h
;;
"3")echo "正在查询硬盘资源情况"echo "=========================="df -h
;;
*)
echo "请输入正确的选项{1|2|3}"
;;
esac

10、函数使用

函数:可以理解为是一个功能。例: print
好处:当有了解决某个问题的函数(功能)时,程序员就可以直接调用这 个函数直接解决问题。
函数的划分:内置函数、自定义函数
内置函数:编程语言自身自带的函数。 例:shell语言中自带函数、
awk语言自带函数(print)
自定义函数: 程序员自已编写的函数。
| -- 函数的定义(如何编写一个函数)
| -- 函数的使用(如何调用编写好的函数)function 函数名字 ()
{程序段;[return int;]
}1、可以带 function fun() 定义,也可以直接 fun() 定义, 不带任何参数。
2、参数返回,可以显示加 return ,如果不加,将以最后一条命令运行结果,作为返回值。
Shell中所有函数在使用前必须定义。这意味着必须将函数放在脚本开始 部分,直至 shell解释器首次发现它时,才可以使用。 调用函数仅使用其函 数名即可。

10.1 函数的简单使用

#!/bin/bash
function print ()
{
echo "jin tian xing qi ji"
echo "星期一"
}
print

10.2 函数的参数

Shell 中,调用函数时可以向其传递参数。在函数体内部, 通过 $n 的 形式来获取参数的值,例如, $1 表示第一个参数, $2 表示第二个参数... 注意, 当 n>=10 时,需要使用${n} 来获取数。
在函数中接收传递的参数可以使用: $n 例:$1 $7 ${10}
调用函数时传递参数: 函数名 参数1 参数2

示例1

#!/bin/bash
function A (){echo "第一个参数是$1"echo "第二个参数是$2"echo "第五个参数是$5"echo "第十个参数是$10"echo "第十个参数是${10}"echo "第十三个参数是${13}"echo "总共有$#个参数"echo "作为一个字符串输出所有参数:$*"
}A 1 2 df 34 g v 4 5 6 xn 456 ,dn dsf 234 bfi weui

示例2

#!/bin/bash
read -p "参数1:" num1
read -p "参数2:" num2
function sum(){sum=$(($num1+$num2))echo ${sum}
}
sum 

10.3 函数的返回值

函数的返回值:函数内部在处理完所有问题后,需要有一个结果返回给调用者。
function 函数名(){......函数体中的代码......
return 数据
}在函数中使用 return 数据值 的方式把数据返回出去
函数的返回值默认是存储在: $?
可以直接使用 $? 操作返回值

示例1

#!bin/bash
function getMax(){if [ $1 -lt $2 ]; thenreturn $2elsereturn $1fi
}echo "输入数值为:$1 $2"getMax $1 $2echo "较大值为:$?"

示例2:函数的返回值默认存储在$?,可直接使用$?操作返回值

#!/bin/bash
add(){sum=$(($1+$2))return $sum
}
add 3 6
echo "结果:$?"

示例3:判断/etc是否为文件,是的话返回100,反之返回200

#!/bin/bash
file=/etc
f1(){if [ -f $file ];thenreturn  100elsereturn  200fi
}
f1 
echo $?

11、数组

数组可以理解为是一个用来存放多个值的容器。
数组中存储的数据,通常可以称为:元素。
当数组中存储了多个元素后,就会给每一个元素添加一个编号(索引),从0 开始。

11.1 定义数组

Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组 大小。
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2 value3 ... valueN)
也可以使用索引来定义数组:
array_name[0]=value0
array_name[1]=value1

11.2 读取数组

读取数组元素值的一般格式是: ${array_name[index]} 。index 是指数组的索引,从0开始。

11.2.1 示例

#!/bin/bash
my_array=(A B C D)
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

11.2.2 获取数组中的所有元素

使用 @ 或 * 可以获取数组中的所有元素,例如: ${array_name[*]}、${array_name[@]}
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

11.2.3 获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,如:${#array_name[*]}、${#array_name[@]}
#!/bin/bash
my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
echo "数组的元素个数为: ${#my_array[*]}"
echo "数组的元素个数为: ${#my_array[@]}"

4.7.3 遍历数组

遍历:把数组中存储的元素依次取出。要使用:循环

方式一

#!/bin/bash
my_arr=(aa bb s d)
for var in ${my_arr[*]}
doecho $var
done

方式二

#!/bin/bash
my_arr=(aa bb cc dd)
for((i=0;i<${#my_arr[*]};i++))
doecho "${my_arr[$i]}"
done

12、加载其它文件变量

在一个Shell程序中可以指定包含外部的其他Shell脚本程序。这样可以很方 便的封装一些公用的代码作为一个独立的文件。Shell 文件包含的语法格式如下:
. 空格 filename # 注意点号"."和文件名中间有一空格
或者
source filename

示例一:

定义两个shell文件分别为: demo12.sh、demo13.sh
1. 在demo12中定义一个变量my_arr=(aa bb cc dd)
2. 在demo13中对my_arr进行循环打印输出
vim demo12.sh#!/bin/bash
my_arr=(aa bb cc dd)vim demo13.sh#!/bin/bash
source /opt/0805/function/demo12.sh
for var in ${my_arr[*]}
doecho $var
done

示例二:

1. 在demo14中获取用户,cpu、内存信息
2. 在demo15中对获取的信息进行输出
vim demo14.sh
#!/bin/bash
echo "user  cpu  memory"
echo "$(whoami) $(top -bn1| grep "Cpu(s)" | awk '{print $2}') 
$(free -h|awk '/Mem/ {print $3}')"vim demo15.sh
#!/bin/bash
source /opt/0805/function/demo14.sh|while read user cpu mem
do
if [ "$user" = "user"  ] ;thenecho "user   cpu   memory    hostname          date"continuefihostname=$(hostname)date=$(date +"%Y-%m-%d %H:%M:%S")echo "$user   $cpu    $mem       $hostname     $date"
done

总结:

本文详细介绍了shell脚本,从入门到组成以及基本shell脚本的编写,并添加众多案例以供参考。

http://www.dtcms.com/a/361845.html

相关文章:

  • apollo学习之纳什均衡求解最优策略
  • MySQL 中 InnoDB 引擎的事务隔离级别与“可重复读”隔离级别下的 SQL 编写规范
  • 2025 中国算力大会精彩回顾:算力驱动未来,液冷引领革新
  • 从 Oracle 到 TiDB,通过ETL工具,高效实现数据拉通
  • HarvardX TinyML小笔记2(番外3:数据工程)(TODO)
  • 【C++游记】AVL树
  • 通过 select into outfile / load data infile 进行数据导入导出学习笔记
  • 【网络安全入门基础教程】网络安全就业方向(非常详细)零基础入门到精通,收藏这篇就够了
  • three.js+WebGL踩坑经验合集(10.2):镜像问题又一坑——THREE.InstancedMesh的正反面向光问题
  • 亥姆霍兹线圈和放载流线圈
  • 【SpreadJS V18.2 新特性】Table 与 DataTable 双向转换功能详解
  • SD卡自动检测与挂载脚本
  • React 第七十一节 Router中generatePath的使用详解及注意事项
  • table表格字段明细展示
  • 【前端教程】ES6 Promise 实战教程:从基础到游戏案例
  • django的URL路由配置常用方式
  • C# Task 入门:让你的程序告别卡顿
  • 基于STM32单片机的无线鼠标设计
  • 【ComfyUI】图像反推描述词总结
  • 杰理ac791无法控制io脚原因
  • 【算法】算法题核心类别与通用解题思路
  • 时序数据库IoTDB:为何成为工业数据管理新宠?
  • 【frontend】w3c的发展历史ToDo
  • accelerate、trainer、lightning还是pytorch?
  • SpringBoot 分库分表 - 实现、配置与优化
  • 雅思听力第四课:配对题核心技巧与词汇深化
  • CLion编译基于WSL平台Ubuntu系统的ros项目
  • 1.人工智能——概述
  • 测试开发的角色
  • 动态规划:硬币兑换II