有时候咱们但愿关闭一些特殊字符的含义,使用\
进行引用chrome
echo price :\$100
除了使用\
来处理单个字符,还可使用单引号引用字符串shell
使用双引号能够有效避免由于含有空格而被认为是多个字符串bash
在编写shell脚本的时候会遇到命令很长的状况,使用\
把命令拆散socket
若是参数的个数不等于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
检查函数定义和取消函数定义this
直接在shell命令行中定义一个函数操作系统
$ qq() #shell可以识别这是一个函数定义 #等待用户输入函数内的内容 好比df-h function> df -h 在命令行输入qq就会显示执行的函数了
使用declare -f qq
来查看声明函数的定义了命令行
使用unset qq
来删除函数的定义code
记录状态信息orm
#!/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
的选项,-atime
指定文件的最后访问时间,-ctime
指定文件最后属性改变时间
选项-type
指明了要找的文件类型参数以下:
查找一个文件不以.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