Linus 说:Talk is cheap, show me the code。
实际上面向对象编程(OOP)和面向过程编程(Procedural Programming)并不是绝对的说辞,而是两种不同的编程范式。
https://www.tiobe.com/tiobe-index/
- 编译型语言:高级语言 --> 基于编译器 --> 编译成机器二进制代码文件 --> 执行。[ 整体编译执行 ]
- 解释型语言:高级语言 --> 执行 --> 基于解释器 --> 解释成机器二进制代码。 [ 逐行解释执行 ]
编译型语言 的代码在执行前需要通过一个称为编译器的特殊程序进行编译。
解释型语言 的代码在执行时并不是直接转换为机器码或字节码,而是通过解释器逐行解释并执行。
[ 例如:Python Shell 脚本 1.py 1.sh ]
编译型语言在执行前将代码编译成机器码,因此执行速度较快,但需要为不同平台编译不同的目标代码。
解释型语言在执行时逐行解释代码,因此执行速度相对较慢,但具有跨平台的优势。不同的语言适用于不同的场景,开发者可以根据需求选择合适的编程语言。
- 将简单的命令组合 完成复杂的工作,自动化执行命令,提高工作效率。
- 减少手工命令的重复输入,一定程度上避免人为错误。
- 将软件或应用的安装及配置 实现标准化。
- 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等。
Shell 脚本:包含一些命令或声明,并符合一定格式的文本文件。
[ 将脚本文件引用到 /usr/local/bin 目录 ]
ln -s /root/hello.sh /usr/local/bin
系统成功基于调用 PATH 路径命令的方式执行 hello.sh
curl -s https://www.wangxiaochun.com/testdir/hello.sh | bash
wget -qO - https://www.wangxiaochun.com/testdir/hello.sh | bash
# ********************************************************************
# URL: https://linux.wuhanjiayou.cn
# Description: The test script
# Copyright (C): 2023 All rights reserved
# ********************************************************************
echo -e "\033[1;32mStarting backup...\033[0m"
cp -av /etc/ /data/etc`date +%F`/
echo -e "\033[1;32mBackup is finished\033[0m"
命令错误,默认后续的命令还会继续执行,用 bash -n 无法检查出来 ,可以使用 bash -x 进行观察。
语法错误,会导致后续的命令不继续执行,可以用 bash -n 检查错误,提示的出错行数不一定是准确的。
[00:29:23 root@blog ~]# cat hello.sh
[00:36:49 root@blog ~]# cat hello.sh
运行 "bash -x hello.sh" 会以调试模式执行 "hello.sh" 脚本,显示每个命令在执行前的扩展状态,方便排查错误和调试。
curl -s https://www.wangxiaochun.com/testdir/system_info.sh | bash
变量 表示命名的内存空间,将数据放在内存空间中,通过变量名引用,获取数据。
内置变量如:PS1,PATH,UID,HOSTNAME,$$,BASHPID,PPID,$?,HISTSIZE。
- 强类型语言:不同类型数据操作必须经过强制转换才同一类型才能运算,如 Java , C#,Python。
- 参考以下 python 代码弱类型语言:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用。如:Bash ,php,Javascript。
- 普通变量:生效范围为当前 shell 进程;对当前 shell 之外的其它shell进程,包括当前 shell 的子 shell 进程均无效。
- 环境变量:生效范围为当前 shell 进程及其子进程。
- 本地变量:生效范围为当前 shell 进程中某代码片断,通常指函数。
# 这种写法用于比较值是否相同: 如 if [ "$name" = "wangj" ]
[ 注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除 ]
命令引用: name=`COMMAND` 或者 name=$(COMMAND)
SDA1_UUID=`lsblk -f | grep root | awk '{print $3}'`
#********************************************************************
#Description: Show system information
#Copyright (C): 2019 All rights reserved
#********************************************************************
$GREEN----------------------Host systeminfo--------------------$END
echo -e "HOSTNAME: $RED`hostname`$END"
#echo -e "IPADDR: $RED` ifconfig eth0|grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |head -n1`$END"
echo -e "IPADDR: $RED` hostname -I`$END"
echo -e "OSVERSION: $RED$PRETTY_NAME$END"
echo -e "KERNEL: $RED`uname -r`$END"
echo -e "CPU: $RED`lscpu|grep '^Model name'|tr -s ' '|cut -d : -f2`$END"
echo -e "MEMORY: $RED`free -h|grep Mem|tr -s ' ' : |cut -d : -f2`$END"
echo -e "DISK: $RED`lsblk |grep '^sd' |tr -s ' ' |cut -d " " -f4`$END"
$GREEN---------------------------------------------------------$END
# ********************************************************************
# URL: https://blog.wuhanjiayou.cn
# Description: The test script
# Copyright (C): 2023 All rights reserved
# ********************************************************************
${COLOR} Starting backup... ${END}
cp -av ${SRC_DIR} ${BACKUP_DIR}${SRC_DIR}_$DATE
${COLOR} Backup is finished ${END}
1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。
ipv4_address=$(hostname -I | cut -d' ' -f1)
os_version=$(cat /etc/os-release | grep "PRETTY_NAME" | cut -d'=' -f2 | tr -d '"')
cpu_model=$(lscpu | grep "Model name" | cut -d':' -f2 | xargs)
memory_size=$(free -h | awk '/Mem/ {print $2}')
disk_size=$(df -h / | awk 'NR==2 {print $2}')
echo -e "主机名: ${RED}$hostname${NC}"
echo -e "IPv4地址: ${GREEN}$ipv4_address${NC}"
echo -e "操作系统版本: ${YELLOW}$os_version${NC}"
echo -e "内核版本: ${GREEN}$kernel_version${NC}"
echo -e "CPU型号: ${YELLOW}$cpu_model${NC}"
echo -e "内存大小: ${GREEN}$memory_size${NC}"
echo -e "硬盘大小: ${YELLOW}$disk_size${NC}"
2、编写脚本 backup.sh,可实现每日将 /etc/ 目录备份到 /backup/etcYYYY-mm-dd中
current_date=$(date +%Y-%m-%d)
if [ ! -d "$backup_dir" ]; then
backup_file="$backup_dir/etc$current_date.tar.gz"
tar -czvf "$backup_file" "$source_dir"
3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值
# 使用df命令获取硬盘分区信息,将其按利用率降序排序,并提取最大利用率的行
max_usage_partition=$(df -h | awk '{print $5 " " $6}' | sort -k1 -n -r | head -n 1)
max_usage=$(echo $max_usage_partition | awk '{print $1}')
partition_path=$(echo $max_usage_partition | awk '{print $2}')
echo -e "最大利用率分区: ${YELLOW}$partition_path${NC},利用率: ${RED}$max_usage${NC}"
4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
# 使用netstat命令获取连接信息,筛选出IPv4地址,按连接数降序排序,并提取唯一的远程主机IP和连接数
connection_info=$(netstat -n -t | grep ESTABLISHED | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c | sort -nr)
cat /proc/14798/environ | tr '\0' '\n'
但由于常规变量是在终端的父进程上赋值的,所以在 退出终端后重新打开 时,这些变量会被重置为它们的初始值。
如果您希望在终端会话之间保留变量的值,可以考虑将它们保存在配置文件中,如 .bashrc 。这样每次打开终端时,这些变量会被自动加载,而不会被重置。
标签:基本,脚本,Shell,变量,echo,sh,用法,hello,bash From: https://www.cnblogs.com/wuhanjiayou/p/17862848.html