Shell基础

本文介绍了Shell的基本概念,包括其作为命令行解释器的作用,脚本编写和执行,变量管理(包括系统预定义、用户自定义、全局变量等),运算符和条件判断的使用,流程控制结构,以及文本处理工具如awk和cut的应用。还涉及了如何通过Shell脚本发送消息和创建定时任务。
摘要由CSDN通过智能技术生成

Shell概述


Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell还是一个功能强大的编程语言,易编写、易调试、灵活性强。常见Shell脚本解析器/bin/sh、/bin/bash。Shell可以开子Shell进程,一层套着一层。子Shell环境变量对父Shell不可见。


Shell脚本入门


脚本文件后缀名.sh。脚本一般以#!/bin/sh或者#!/bin/bash开头,指定解释器。执行方式sh/bash + 脚本文件的相对路径或者绝对路径,也可以直接输入脚本文件相对路径或者绝对路径执行但是要给脚本文件添加可执行权限,还可以source + 脚本文件、. + 空格 + 脚本文件执行。source和.命令是在当前Shell里执行,其他是重新开一个Shell进程执行。


变量


系统预定义变量

常用系统变量$ HOME、$ PWD、$ SHELL、$ USER。查看所有系统预定义全局变量env、printenv。set查看所有全局变量和局部变量。

用户自定义变量

自定义变量方式 变量名 + “=” + 初值。将局部变量提升为全局变量 export + 变量名。子Shell的变量更改不会影响到父Shell。

全局变量、只读变量和撤销变量

readonly定义只读变量,unset撤销已定义的变量。

特殊变量

$ n,n是0表示脚本名称,1-9表示第1个到第9个参数,10以上的数字要用{}包含起来。$ #,获取所有输入参数个数,常用与循环。$ *,获取所有参数,不过把所有参数当作一个整体。$ @,也是获取所有参数,不过把每个参数区分对待。$ ?,最后一次执行命令的返回状态,返回值为0则表示命令执行正确。


运算符


expr命令,表达式计算,比如expr 1 + 2, 表达式之间用空格隔开。$ []、$ (()),表达式放在中括号或者两个小括号里。


条件判断


test命令判断表达式为真还是为假。为真返回0,为假返回非0值。[ 表达式 ]也可判断,注意表达式前后必须有空格。数值常用判断条件 -eq、-nq、-lt、-le、-gt、-ge。字符串常用判断条件 =、!=。文件权限判断条件 -r、-w、-x。文件类型判断条件 -e、-f、-w。多条件判断 &&、||、-a、-o。-z 判断字符串是否为空。


流程控制


if单分支
if [ 条件判断式 ];then
	程序
fi
或者
if [ 条件判断式 ]
then
	程序
fi
if多分支
if [ 条件判断式 ]
then
	程序
elif [ 条件判断式 ]
then
	程序
else
	程序
fi
case多分支
case $变量名 in
"value 1")
	程序1
;;
"value 2")
	程序2
;;
...
*)
	默认程序
;;
esac
for循环
for (( 初始值;循环控制条件;变量变化 ))
do
	程序
done
或者
for 变量 in 值1 值2 值3...
do
	程序
done
生成序列{1..100}表示1到100
while循环
while [ 条件判断式 ]
do
	程序
done

let命令可以让Shell语法更接近高级变成语言。


读取控制台输入


read命令,-p 指定读取值时的提示符,-t 指定读取值时等待的时间,如果不加则表示一直等待。


函数


系统函数

basename,截取路径中最后一个 / 之后的内容输出,还可以加后缀选项可以将截取之后的文件名的后缀去掉。dirname,和basename相反,输出截取处之前的路径,dirname最好直接对绝对路径进行操作。

自定义函数
[ function ] funcname[()]
{
	Action;
	[return int;]
}

return 后面的值只能跟0-255。不加return以最后一条命令的执行结果为返回值。


归档文件

tar命令,-c选项表示归档,-z选项表示同时进行压缩,得到的文件后缀名为.tar.gz。

#!/bin/bash

if [ $# -ne 1]
then
	echo "参数个数错误!请输入一个参数作为归档目录名"
	exit
fi

if [ -d $1 ]
then
	echo
else
	echo
	echo "目录不存在"
	echo
	exit
fi

DIR_NAME=$(basename $1)
DIR_PATH=$(cd &(dirname $1); pwd)

DATE=$(date +%y%m%d)

FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE

echo "开始归档"
echo

tar -czf $DEST $DIR_PATH/$DIR_NAME

if [ $? -eq 0 ]
then
	echo
	echo "归档成功"
	echo "归档文件为:$DEST"
	echo
else
	echo "归档出现问题"
	echo
fi

crontab命令创建一个定时任务。-e新建一个定时任务,-l 查看所有定时任务。


正则入门


| 管道操作。完全匹配 grep word。常用特殊字符 ^,匹配一行的开头。常用特殊字符$,匹配一行的结束。-n显示行数。常用特殊字符 . ,匹配任意一个字符。常用特殊字符 * ,不单独使用,表示上一个字符出现0次或者任意多次。常用特殊符号[ ],匹配某个范围内的一个字符。常用特殊符号转义字符 \ ,配合其他特殊字符使用用来匹配特殊字符。扩展特殊字符,{ }匹配字符数量,+ 匹配出现1次到n次,?匹配0次或者1次,-E表示支持这些扩展的正则表达式。-i 忽略大小写, -m 最大匹配行数。


文本处理工具


cut

在文件中剪切数据用的,默认分隔符是制表符。-f 列号,提取第几列,-d 分隔符,按照指定分隔符分割列,默认是制表符’\t’,-c 按照字符进行切割,后面加n表示切割第几列。

awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。-F 指定输入文件分隔符,-v 赋值一个用户定义变量。’ ’ 引号引起来一系列正则表达式用来匹配。BEGIN一行开头,END一行结尾。awk内置变量,FILENAME 文件名,NR 已读的记录数(行数),NF 浏览记录的域的个数(分割后,列的个数)。


发送消息


who查看登录用户,who am i查看自己用户信息,who -T查看用户是否打开消息收发功能,mesg查看是否打开消息接收功能,mesg y 打开消息接收功能,mesg n 关闭消息接收功能,write 往其他用户发送消息。

#!/bin/bash

login_user=$(who | grep -i -m 1 $1 | awk '{print $1}')

if [ -z $login_user ]
then
	echo "$1 不在线!"
	echo "脚本退出..."
	exit
fi

is_allowed=$(who -T | grep -i -m 1 $1 | awk '{print $2}')

if [ $is_allowed != "+" ]
then
	echo "$1 没有开启消息功能"
	echo "脚本退出..."
	exit
fi

if [ -z $2 ]
then
	echo "没有消息发送"
	echo "脚本退出..."
	exit
fi

whole_msg=$(echo $* | cut -d " " -f 2-)

user_terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')

echo $whole_msg | write $login_user $user_terminal

if [ $? != 0 ]
then
	echo "发送失败!"
else
	echo "发送成功!"
fi

  • 32
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值