目录
read读取控制台输入
基本语法
read (选项) (参数)
选项:
-p : 指定读取值时的提示符
-t : 指定读取值时等待的时间(秒)如果-t 不加表示一直等待
参数 变量:指定读取值的变量名
函数
系统函数
basename
基本语法:
basename [string / pathname] [suffix]basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来basename 可以理解为取路径里的文件名称选项: suffix 为后缀,如果 suffix 被指定了, basename 会将 pathname 或 string 中的 suffix 去掉
dirname
基本语法
dirname 文件绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)dirname 可以理解为取文件路径的绝对路径名称
自定义函数
基本语法
[ function ] funname [()]
{
Action ;
[return int;]
}
经验技巧
1. 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一
样先编译2. 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255)
#!/bin/bash
function sum()
{
s=0 s=$[$1+$2]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
正则表达式
正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文 本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep,sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配
特殊字符:^
^ 匹配一行的开头 (匹配所有以a 开头的行)
$ cat /etc/passwd | grep ^a
特殊字符 : $
$ 匹配一行的结束 (匹配所有以t结尾的行)
$ cat /etc/passwd | grep t$
特殊字符:.
. 匹配一个任意的字符(会匹配包含rabt,rbbt,rxdt,root) 等的所有行
$ cat /etc/passwd | grep r..t
特殊字符:*
*
不单独使用,他和上一个字符连用,表示匹配上一个字符
0
次或多次
会匹配
rt, rot, root, rooot, roooot
等所有行
$ cat /etc/passwd | grep ro*t
文本处理工具
cut
cut
的工作就是
“
剪
”
,具体的说就是在文件中负责剪切数据用的。
cut
命令从文件的每
一行剪切字节、字符和字段并将这些字节、字符和字段输出。
基本用法cut [ 选项参数 ] filename (默认分隔符是制表符)
选项参数 | 功能 |
-f |
列号,提取第几列
|
-d |
分隔符,按照指定分隔符分割列,默认是制表符“\t”
|
-c |
按字符进行切割 后加加
n
表示取第几列 比如
-c 1
|
awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理
基本用法awk [ 选项参数 ] ‘ /pattern 1/{action1} /pattern2/{action2} ....' filenamepatern : 表示awk在数据中查找的内容,就是匹配模式action :在找到匹配内容时所执行的一系列命令
选项参数 | 功能 |
-F | 指定输入文件分隔符 |
-v | 赋值一个用户定义变量 |
综合案例
归档文件
#!/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
exit
发送消息
#!/bin/bash
login_user=$(who | grep -i -m 1 $1 | awk '{print $1}')
if [ -z $login_user ]
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
exit