ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Bash Shell 基础特性

Bash Shell 基础特性

原创 Linux操作系统 作者:孤竹星 时间:2015-07-28 15:36:58 0 删除 编辑
Bash Shell 基础特性之globbing
文件名通配:元字符
    *:匹配任意长度任意字符
            pa*,*pa*,*pa,p*a,*p*a

    ?:匹配任意单个字符
            p?

            pad:p?d,p*d
            pd:p?d, p*d
            paad: p?d, p*d

    []:匹配指定集合内的任意单个字符
            [0-9]:任意数字
            [a-z]:任意小写字符
            [A-Z]:任意大小字符
            [0-9a-dA-Z]  [[:alnum:]]

    [^]:匹配指定集合外的任意单个字符
            p[^k-z]*

    字符集合:
            [:space:] 所有的空白字符, [[:space:]]
            [:punct:] 所有标点符号
            [:lower:] 所有小写字母
            [:upper:]     大
            [:digit:] 所有数字
            [:alpha:] 所有字母
            [:alnum:] 所有字母和数字

练习1:显示/var目录下所有l开头,以一个小写字母结尾,且中间出现一位数字的文件或目录;
# ls -d /var/l*[[:digit:]]*[[:lower:]]   
练习2:显示/etc/目录下,以任意一位数字开头,且以非数字结尾的文件或目录;
# ls -d /etc/[0-9]*[^0-9]
练习3: 显示/etc/目录下,以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录;
# ls -d /etc/[^[:alpha:]][[:alpha:]]*
练习4:复制/etc/下,所有以m开头,以非数字结尾的文件或目录至/tmp/mageedu目录中;
# mkdir /tmp/mageedu
# cp -a /etc/m*[^0-9] /tmp/mageedu/
练习5:复制/etc目录下,所有以.d结尾的文件或目录至/tmp/mageedu2目录中;
# mkdir /tmp/mageedu2
# cp -a /etc/*.d /tmp/mageedu2/
练习6:复制/etc目录下,所有以.conf结尾,以m,n,r,p开头的文件或目录至/tmp/mageedu3目录中;
# mkdir /tmp/mageedu3
# cp -a /etc/[mnrp]*.conf /tmp/mageedu3


bash特性之快捷键:
Ctrl + a: 跳转至命令首部
Ctrl + e: 跳转至命令尾部
Ctrl + l: 清屏
Ctrl + c: 中止或取消
Ctrl + u: 删除命令行首至光标所在处的所有字符
Ctrl + k: 删除光标所在处至命令尾部的所有字符


bash特性之输入输出重定向及管道
程序:有输入或输出的需求

标准输入:keyboard,0
标准输出:monitor, 1
错误输出:monitor, 2

fd: file descriptor,文件描述符

输出重定向:>, >>
>: 目标文件中原有内容会被清除;
>>: 新内容被追加至目标文件尾部;

# set -C : 禁止使用覆盖输出重定向
此时依然可以使用>|进行强制覆盖
# set +C

错误输出重定向:2>, 2>>
2>
2>>

合并标准输出和错误输出的数据流至同一处:&>, &>>
&>
&>>

COMMAND > 文件名 2> &1
COMMAND >> 文件名 2>> &1

输入重定向:<

tr命令:转换或删除字符
tr [OPTION]... SET1 [SET2]
-d: 删除字符

Here Document:<<
# cat << EOF
# cat > 文件名 << EOF

管道:连接命令,实现将前一个命令的输出当作后一个命令的输入
COMMAND1 | COMMAND2 | COMMAND3 ...

练习1:将/etc/passwd文件的内容的前十行转换为大写输出;
# head /etc/passwd | tr 'a-z' 'A-Z'
练习2:将登录至当前系统上的所有用户的前两个的信息转换为大写输出;
# who | head -2 | tr 'a-z' 'A-Z'

文本查看及处理工具:
wc [OPTION] FILE...
-c: 字节数
-l:行数
-w: 单词数

cut OPTION FILE ...
-d CHAR: 指定字段分隔符
-f #|#-#|#,#:指定要显示的字段

sort [OPTION...] FILE...
-n: 按数值大小进行排序
-r: 逆序
-f: 忽略字符大小写
-t CHAR: 指定字段分隔符
-k #: 指定用于排序的字段
-u: 重复的行只保留一次

uniq [OPTION...] FILE...
-c: 显示每行出现的次数;
-d: 仅显示重复的行;
-u: 仅显示不曾重复的行;

练习:取出ifconfig eth0结果中的ip地址;
# ifconfig eth0 | head -2 | tail -1 | cut -d: -f2 | cut -d' ' -f1

bash脚本的编写
命令堆砌

1、脚本绝对第一行从一个字符位置开始给出shebang:
#!/bin/bash

2、运行脚本:
(1) 给脚本执行权限,而后指定脚本路径并运行之;
(2) # bash 脚本路径 

练习1:写一个脚本
(1) 创建目录/tmp/testdir; 
(2) 复制文件/etc/fstab, /etc/rc.d/rc.sysinit至此目录中;

#!/bin/bash
directory=/tmp/testdir
mkdir $directory
cp /etc/fstab /etc/rc.d/rc.sysinit $directory

引用方式:
强引用:''
弱引用:""
命令引用:`COMMAND`, $(COMMAND)

bash中的算术运算:
+, -, *, /, %

实现算术运算:
(1) let var=算术表达式
  (2) var=$[算术表达式]
  (3) var=$((算术表达式))

  a=6
  a=$[$a+2]

bash中的增强型赋值:
+=, -=, *=, /=, %=

aa+=2   --->   aa=$[$aa+2]
aa-=3   --->   aa=$[$aa-3]

let var++   let aa++  --->   let  aa=$aa+1
let var--   let aa--  --->   let  aa=$aa-1

练习:写一个脚本
计算/etc/rc.d/rc.sysinit的行数与/etc/rc.d/init.d/fucntions文件行数之和;
#!/bin/bash
syslines=`wc -l /etc/rc.d/rc.sysinit |cut -d " " -f 1`
funclines=$(wc -l /etc/rc.d/init.d/functions |cut -d " " -f 1)
lines=$[$syslines+$funclines]
echo $lines

bash编程的知识点:位置变量和特殊变量

位置参数变量:
scirpt1.sh arg1 arg2 ...
$0         $1   $2   ...  ${10} ...

脚本注释:除第一行的shebang之外,任何以#开头的行都表示为注释信息,会被解释器忽略;
# information

特殊变量:
$#:位置参数变量的个数, 
$@:位置参数列表 
$*:位置参数列表

练习2:写一个脚本,能接受一个参数,此参数为系统上的某文本文件路径;
(1) 显示此文件的总行数;
#!/bin/bash
filedir=$1
lines=`wc -l $filedir |cut -d ' ' -f 1`
echo "$filedir lines is :$lines"

Linux任务计划、周期性任务执行

周期性任务执行: cron

守护进程(crond):服务,不间断地运行于后台

# service crond {start|stop|status|restart}

cron的任务分两类:
系统cron任务:定义在/etc/crontab文件中
用户cron任务:定义在/var/spool/cron/USERNAME文件中;功能类似于/etc/crontab文件

每行定义一个周期性任务计划

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

例如:在7点8分运行echo "how are you?"
08 07 * * * root /bin/echo "how are you?"

结果通过邮件进行通知;

时间表示法:
时间:
分钟:有效取值0-59
小时:有效取值0-23
天:1-31
月:1-12
周几:0-7

(1) 给出其有效取值范围内的某特定值;
5 * * * * /bin/echo "howdy"
16 8 * * * /bin/echo "howdy"
16 9 * * 3 /bin/echo "howdy"
12 11 20 * * /bin/echo "howdy"
03 07 01 07 * /bin/echo "howdy"
(2) *:给定时间位上的有效取值范围内的所有可用值
(3) -: 给定时间位连续取值区间
6-12 * * * * /bin/echo "howdy"
(4) ,: 给定时间位上的离散取值
1,31 * * * * /bin/echo "howdy"
1,31 6,18 * * * /bin/echo "howdy"
(5) */#: 对应时间位每#个时间单位一次;
1 2 */3 * * /bin/echo "howdy"

如何定义用户cron任务:
crontab命令:
-l: 显示任务列表
-e:编辑任务
-r: 移除所有任务 

注意:
(1) cron运行时是以cron有自己的运行环境;以cron身份运行命令或脚本时,建议使用绝对路径,或在脚本中明确定义PATH环境变量;
(2) cron的任务结果以邮件通知,如果不想接收邮件,可使用输出重定向:
> /dev/null
&> /dev/null
> /dev/null 2>&1
(3) 对于cron任务来说,%有特殊用处,如果在命令中需要用到%,得转义,使用\%格式;如果%放置于单引号中,也可不用转义
10 03 * * * tar Jcf /backup/etc-$(date +\%F-\%H-\%M-\%S).tar.xz /etc/*

练习
1、每4小时备份一次/etc/目录至/backup目录中,保存的文件为格式为形如etc-20141124010101.tar.xz;
1 */4 * * * /bin/tar Jcf /backup/etc-$(date +'%Y%m%d%H%M%S').tar.xz /etc/* &> /dev/null

2、每周2,4,7备份/var/log/messages文件至/backup/messages/目录中,文件名保存为形如messages-20141124.tar.xz;
1 1 * * 2,4,7 /bin/tar Jcf /backup/messages/messages-$(date +'%Y%m%d').tar.xz /var/log/messages &> /dev/null

3、工作日的工作时间内,每小时执行一次ip addr show命令;
1 9-18 * * 1-5 /sbin/ip addr show 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28282660/viewspace-1754253/,如需转载,请注明出处,否则将追究法律责任。

下一篇: linux 用户管理
请登录后发表评论 登录
全部评论

注册时间:2013-01-22

  • 博文量
    96
  • 访问量
    210613