LinuxShell3学习(三)

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

转载于:https://my.oschina.net/kakoi/blog/652241

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值