LinuxShell
引用
有时候我们希望关闭一些特殊字符的含义,使用\
进行引用
echo price :\$100
除了使用\
来处理单个字符,还可以使用单引号引用字符串
使用双引号可以有效避免因为含有空格而被认为是多个字符串
在编写shell脚本的时候会遇到命令很长的情况,使用\
把命令拆散
函数
如果参数的个数不等于2,就调用usage()函数,并以1状态退出脚本
#!/bin/bash
useahe(){
echo "Usage $0 operator file"
exit 1
}
if [ $# -ne 2 ]; then
echo "error"
useahe
else
echo "my script is running"
exit 0
fi
检查函数定义和取消函数定义
直接在shell命令行中定义一个函数
$ qq()
#shell能够识别这是一个函数定义
#等待用户输入函数内的内容 比如df-h
function> df -h
在命令行输入qq就会显示执行的函数了
使用declare -f qq
来查看声明函数的定义了
使用unset qq
来删除函数的定义
记录状态信息
#!/bin/bash
printMsg(){
#如果参数小于两个,报错
if [ $# -lt 2 ]; then
echo "printMsg needs 2 arg"
return 1
fi
PREFIX="$1"
#以参数1,参数2打印参数列表
echo "$PREFIX:$@"
}
logMsg(){
if [ -n "$1" ]; then
echo "`date`$@">>arg.log
else
echo "need more arg"
return 1
fi
}
printMsg "今天" "天气情" && logMsg "上" "海边"
实现一个函数,用来返回一个程序名对应的PID,如果程序正在运行,则函数返回0,并且输出这个进程的进程号,否则返回函数1
#!/bin/bash
pidof_process(){
if [ $# -ne 1 ] ; then
#在调用参数个数不为1,则显示错误信息并以1状态退出
echo "error function pidof_process need one arg"
exit 1
fi
#通过pidof 得到程序名对应的pid
#并把PID值之间的空格替换为\n,从而获得一个pid 列表
PID=`pidof "$1" | tr '' '\n'`
if [ -z "$PID" ]; then
#如果pidof命令的输出为空,说明参数$1保存的程序名没有被执行
echo "$1 is not running"
return 1
else
#如果程序正在运行则打印PID列表
echo "$PID"
return 0
fi
}
CHROME_PID=`pidof_process "chrome"`
#检查函数的退出状态
if [ $? -eq 0 ]; then
echo "pid $CHROME_PID"
else
echo "not found"
fi
exit 0
创建一个函数库
如果一个脚本要用到的函数很多,把他们都写在一个脚本的开头,读程序的人会翻好几页但是找不到函数的很多
我们要实现的函数定义到一个库文件,library.lib中然后运行文件包含这个库文件.这样在脚本中就可以引用库文件定义的库函数了
库文件library.lib
#!/bin/echo Warning:this is a library which should be sourced!
#定义这一行作用是防止库文件被意外执行
test_platform(){
local osname=`uname -s`
PLATFORM=UNKONWN
#在本地变量os中保存当前的操作系统
case ${osname} in
"FreeBSD")
PLATFORM="FreeBSD"
;;
"SunOs")
PLATFORM="sunos"
;;
"Darwin")
PLATFORM="Darwin"
;;
esac
return 0
}
脚本文件library.sh
#!/bin/bash
#首先在脚本程序中包含库文件library.lib从而可以调用其中的函数
source ./library.lib
#调用函数库的函数test_platform
test_platform
echo
echo "Our platform is $PLATFORM"
exit 0
首先在当前目录创建一个库文件library.lib
1)库文件的后缀是任意的
2)库文件通常没有可执行权限
3)放置库文件的位置是随意的
其他常用命令
通过find
命令 找到所有的音乐文件,并把这些文件移到/tmp/songs文件夹下
#!/bin/bash
#首先在tmp目录创建一个文件夹
mkdir -p ${HOME}/Desktop/tmp/songs
#检查mkdir是否创建成功
if [ $? -eq 0 ]; then
#find -iname 在匹配文件的时候不会区分文件名的大小写
#选项-exec 会把它送来的路径当作命令行的一部分
#在执行每一个命令之前要在{}两边加上单引号,目的是防止文件的路径中含有空格
find ~ -iname "*.mp3" -print -exec mv '{}' /tmp/songs \;
fi
echo
echo "All mp3 files have been moved to dir"
echo
exit 0
find 命令
find . -mtime -1 -type f
find
命令的-mtime
选项指定了所要查找文件最后修改的时间,选项-mtime
的参数n,含义是天数
- -mtime n #修改的时间等于多少天
- -mtime +n #修改的时间多余多少天
- -mtime -n #修改的时间少于多少天
还有两个类似于 -mtime
的选项,-atime
指定文件的最后访问时间,-ctime
指定文件最后属性改变时间
选项-type
指明了要找的文件类型参数如下:
- -type f 搜索普通文件
- -type l 搜索链接文件
- -type d 搜索目录
- -type b 搜索块设备文件
- -type c 搜索字符设备文件
- -type p 搜索命名的管道文件
- -type s 搜索socket文件
查找一个文件不以.txt
结尾
find . ! \( -name '*.txt' \) -print
使用file 文件查看文件的信息
file 文件名
file ~ 目录
备份文件
将当前目录的所有文件打包到files.tar
文件下
tar - cvf files.tar *
选项-c
表示要执行的操作是创建打包文件,选项-v
打包过程中输出被追加到tarball中的文件列表-f
表示
信号量
信号是一个进程发送给另一个进程的消息,信号使两个进程之间相互通信
使用kill - l
来查看系统中所有的信号
定时器,希望用户在规定的时间内输出用户名和密码
#!/bin/bash
Expire_Handler(){
echo "got sigalarm signal waiting u too long"
echo "Bye"
#从脚本退出代码14,用来表示接收到了sigalrm信号
exit 14
}
Start_Timer(){
#如果没有指定参数的话,默认为10s
local INTERVAL=${1:-10}
if [ $INTERVAL -gt 0 ]; then
sleep $INTERVAL && kill -s 14 $$ &
TIMERPID=$!
else
echo "error interval must be integer"
exit 1
fi
}
Unset_Timer(){
kill 'pgrep -P'$TIMERPID
kill $TIMERPID
}
trap Expire_Handler 14
echo
echo "u have only 15 s to enter u info "
Start_Timer 5
read id
#Unset_Timer
echo "u id is $id"
echo "all done "
exit 0