ls 显示目录内容,不包含以点开头的文件
ls -a 显示目录内容,包含以点开头的文件
ls -l 长格式显示目录内容
ls -d 显示目录自身的信息,通常与-l同时使用
ls -r 逆序显示目录内容
ls -R 递归显示目录内容
ls -h 以易读的方式显示文件大小,通常与-l同时使用
ls -i 显示inode信息
tree 树状形式显示目录内容
alias 显示当前shell中定义的所有别名
alias 别名='原始命令' 定义别名
unalias 别名 删除命令别名
file FILE... 查看文件内容格式
cat -E FILE 显示行结束符
cat -v FILE 显示非打印字符
cat -e FILE 相当于-vE
cat -n FILE 显示时给行按顺序编号
cat -s FILE 多个连续的空白行显示为一个空白行
head -# 显示文件顶部#行的内容
tail -# 显示文件尾部#行的内容
tail -#f 动态显示文件尾部#行的内容
echo命令的用法:
echo -e "\033[##;##m string \033[0m"
第一个#: 3表示前景色,4表示背景色
第二个#:颜色,0-7
0 黑色
1 红色
2 绿色
3 黄色
4 蓝色
5 紫色
6 天蓝
7 白色
echo -e "\033[31;42;5m LINUX \033[0m"
效果:绿底红字闪烁
通配符:
* 匹配任意长度的任意字符
? 匹配任意单个字符
[] 匹配指定字符范围内的任意单个字符
[^] 匹配指定字符范围外的任意单个字符
[:upper:]] 所有大写字母
[:lower:]] 所有小写字母
[:alpha:]] 所有字母
[:digit:]] 0-9
[:alnum:]] 0-9及所有字母
[:space:]] 所有空白字符
[:punct:]] 所有标点符号
练习:复制/var目录下所有以l开头,以一个小写字母结尾,且中间出现一位数字的文件或目录至/tmp下
cp -r /var/1*[0-9]*[a-z] /tmp
练习:如果符合条件是目录,也要复制;
1、复制/etc目录下以p开头,中间跟了任意字符,并以d结尾的文件至/tmp目录中;
2、复制/etc/目录下以p开头,中间跟了4个任意字符,并以d结尾的文件至/tmp/a目录中;如果a不存在,先创建出来;
3、复制/etc/目录下以任意一位数字开头,并以非数字结尾的文件至/tmp/b目录中;
4、复制/etc/目录下以非字母开头,后面跟了一个字母及其它任何长度字符的文件至/tmp/c目录中;
1、cp -r /etc/p*d /tmp
2、cp -r /etc/p????d /tmp/a
3、cp -r /etc/[0-9]*[^0-9] /tmp/b
4、cp -r /etc/[^[:alpha:]][[:alpha:]]* /tmp/c
cp命令的长用选项:
-r:递归
-d: 当源为链接文件时,复制链接文件本身而非指向的源文件
-p: 保持原有属性
mv: 移动文件,或重命名
rm: 移除文件
删除非空目录:# rm -rf
stat FILE 显示文件或文件系统信息,包含(access、modify、change时间)
touch FILE 创建空文件或修改文件时间信息
-c: 不创建空文件
-a: 仅修改访问时间
-m: 仅修改修改时间
-t STAMP: [CC]YYMMDDhhmm.ss 修改当前时间
/etc/passwd:
用户名:x:UID:基本组ID:comment信息:HOME:默认shell
useradd: adduser
-u UID:指定UID
-g GID: 指定GID,即指定用户的基本组,但GID要事先存在
-G GID:指定用户的额外组,组要事先存在;
-c "Comment":
-d /path/to/somewhre:
-s /path/to/shell: 指定默认shell,应该指定使用/etc/shells文件中出现的shell;
-m: 创建用户时,强制给用户创建家目录;
-M: 创建用户,但不创建家目录;
-r: 创建系统用户
id: 1-499
不会为用户创建家目录
默认shell为/sbin/nologin
groupadd GrpName
-g GID: 创建组并为其指定GID
用户类别:
管理员:0
普通用户:1-65535
系统用户:1-499
登录用户:500+
用户组:
管理员组
普通组
以用户为视角,组可为两类:
基本组: 显示在/etc/passwd中GID字段组,为用户的基本组;
额外组,附加组: /etc/group
userdel: 删除用户, 默认会保留家目录
格式:userdel UserName
-r: 一并删除家目录
设定用户密码: passwd
普通用户:passwd
管理员:
改自己密码:passwd
改其它用户密码:passwd UserName
/etc/shadow文件的格式:
UserName:加密的密码:最近一次密码修改时间:最短使用期限:最长使用期限:警告区间:非活动区间:帐号的过期期限:预留段
passwd -l UserName 锁用户
passwd -u UserName 解锁
设定组密码:gpasswd GroupName
usermod:
-u UID:
-g GID:
-G GID: 默认会覆盖原有的附加组;如果是添加,则同时使用-a选项;
-c String:
-d /path/to/New_Home: 默认不会迁移用户的家目录;如果要迁移,则同时使用-m
-s SHELL:
-l New_login_name:
-L: 锁定用户帐号
-U: 解锁
如何修改组属性定义:
groupmod:
-g GID
-n New_Group_Name:
UserName:加密的密码:最近一次密码修改时间:最短使用期限:最长使用期限:警告区间:非活动区间:帐号的过期期限:预留段
修改帐号日期属性:chage
-m 修改最短使用期限。为零时代表任何时候都可以更改密码
-M 修改最长使用期限。密码保持有效的最大天数
-W 修改警告区间。用户密码到期前,提前收到警告信息的天数
-I 修改非活动区间或停滞日期。如果一个密码已过期这些天,那么此帐号将不可用
-E 修改帐号的过期期限。过了这天,此帐号将不可用
查看用户相关信息id:
id UserName
-u: 显示UID,跟-n一起使用则显示用户名
-g: 显示基本组ID,跟-n一起使用则显示基本组名
-G: 显示所有组ID,跟-n一起使用则显示所有组名
su -l UserName 切换用户,且切换到该用户的家目录
练习:
1、创建一个用户mandriva,其ID号为2002,基本组为distro(组ID为3003),附加组为linux;
# groupadd linux
# groupadd -g 3003 distro
# useradd -u 2002 -g distro -G linux mandriva
2、创建一个用户fedora,其全名为Fedora Community,默认shell为tcsh;
# useradd -c "Fedora Community" -s /bin/tcsh fedora
3、修改mandriva的ID号为4004,基本组为linux,附加组为distro和fedora;
# usermod -u 4004 -g linux -G distro,fedora mandriva
4、给fedora加密码,并设定其密码最短使用期限为2天,最长为50天;
# passwd fedora
# chage -m 2 -M 50 fedora
5、将mandriva的默认shell改为/bin/bash;
# chsh -s /bin/bash mandriva
Linux文件类型:
普通文件 -
目录 d
链接文件 l
字符设备 c
块设备 b
命名管道 p
套接字文件 s
权限:read, write, execute
用户不拥有某位权限,则使用 - 占位;
文件:
r: 可以使用内容查看类的命令来显示其相关内容;
w: 可以使用编辑器修改其内容;
x: 可以将其发起一个进程;
目录:
r: 可以使用ls命令查看目录内容的文件信息;
w: 可以创建、删除文件;
x: 可以使用ls -l命令查看目录内容的文件信息,并且可用cd命令切换此目录为工作目录;
chmod命令:
操作三类用户的权限:使用8进制形式
chmod [-R] OCTAL-MODE file...
-R可以递归修改目录下文件的权限
操作指定类别用户的权限:使用u,g,o,a来赋权,基于=或+/-来进行
u: 属主
g: 属组
o: 其它
a: 所有
=:操作指定类别用户的权限;u=, ug=, u=,g=
+/-: 操作指定类别用户的单个权限: u-x, g+r, o-x, +x
参照其它文件的权限为当文件赋权
--reference=要参照的文件 要修改权限的文件
umask
创建文件:666-umask
文件默认决不允许出现执行权限,如何具有执行权限,则权限值加1;
创建目录:777-umask
root用户的umask为022;用户名和基本组组名一致umask为002,否则umask为022;
修改文件的属主或属组:chown, chgrp
-R: 递归
--reference=
chown [option] UserName[{:|.}GroupName] file...
权限应用模型:
进程的属主,是否与文件的属主相同;如果相同,进程则以文件属主的权限来访问文件;否则
进程的属主所属的组,是否其中之一与文件的属组相同;如果相同,进程则以文件属组的权限来访问文件;否则,
进程则以文件的其它用户的权限来访问文件;
练习:
1、新建一个用户openstack,但不给其创建家目录;创建完成后使用su命令切换至此用户,查看其命令提示符及PATH和HOME两个环境变量的值;
# useradd -M openstack
# su - openstack
# echo $PATH $HOME
2、复制/etc/skel目录为/home/openstack;
# cp -r /etc/skel /home/openstack
3、改变/home/openstack及其内部文件的属主属组均为openstack;
# chown -R openstack.openstack /home/openstack
4、/home/openstack及其内部的文件,属组和其它用户没有任何访问权限;
# chmod -R go= /home/openstack
# su - openstack
# echo $PATH $HOME
练习:
完成以下任务:
(1)新建系统组mysql;新建系统用户mysql,属于mysql组,要求其没有家目录且shell为/sbin/nologin;
# groupadd -r mysql
# useradd -r -s /sbin/nologin -g mysql mysql
(2)新建GID为600的组magedu;新建用户gentoo,要求其家目录为/users/gentoo,密码同用户名;
# groupadd -g 600 magedu
# mkdir /users
# useradd -d /users/gentoo gentoo
# passwd gentoo
(3)新建用户centos,其家目录为/users/centos,密码同用户名;
# useradd -d /users/centos centos
# passwd centos
(4)新建用户www,其家目录为/users/www;删除www用户,但保留其家目录;
# useradd -d /users/www www
# userdel www
(5)用户gentoo和centos均以magedu为其附加组;
# usermod -a -G magedu gentoo
# usermod -a -G magedu centos
bash特性之六:bash的快捷键
Ctrl+a: 跳至命令行首
Ctrl+e: 跳至命令行尾
Ctrl+u: 删除命令行首至当前光标所在处的内容
Ctrl+k: 删除当前光标所有处至命令行尾的内容
Ctrl+l: 清屏,相当于clear命令
Ctrl+c: 取消或终止;
Ctrl+z: 将当前命令送至后台,fg调回前台
ELF:
#!/bin/bash
程序=指令+数据
变量:
弱类型语言:
1、不强制区分变量的类型,无论存储何种数据,均以字符格式进行;
2、无须事先声明;用到时,直接使用,直接赋值;
bash: 动态编程语言,是弱类型语言;
bash的特性之九:bash中的变量
变量的类型:
本地变量:只对当前shell进程有效,对其子shell以及其它shell都无效;
定义变量: [set]Var_Name="Value"
引用变量: ${Var_Name}
撤销变量: unset Var_Name
局部变量:仅对局部代码生效
local Var_Name="Value"
环境变量:对当前shell进程及其子shell都有效;
export Var_Name="Value"
或
Var_Name="Value"
export Var_Name
位置变量:
$1, ..., $n
./first.sh 2 8
特殊变量:
$0: 脚本名称自身
$?: 上一条命令的执行状态;
状态用数字来表示:0-255;
0: 成功
1-255: 失败
$$
$!
$# 位置参数的个数
$* 所有的位置参数
变量的命名要求:
只能使用数字、字母和下划线组成;
不能以数字开头;
不能使用程序中的关键字;
见名知义;totalWeight
set
环境变量:用来bash的工作特性,用于保存当前会话的属性信息;
显示所有环境变量:export, env, printenv
定义:export Var_Name="Value"
PATH, PS1
bash的配置文件:持久保存用户配置
profile类:为交互式登录的用户提供配置
/etc/profile:全局
/etc/profile.d/*.sh:全局
~/.bash_profile:个人配置,仅对当前用户有效
功能:
设定环境变量
运行命令或脚本
bashrc类:非交互工登录用户提供配置
/etc/bashrc: 全局
~/.bashrc: 个人配置
功用:
设定本地变量
定义命令别名
登录类型:
交互式登录:
直接通过终端输入用户信息登录系统;
su - UserName或su -l UserName;
非交互式登录:
su UserName
图形界面的终端
执行脚本
新增配置的生效方式:
通知shell重读配置文件的命令:
source (.)
. FILE
重新登录
交互式登录用户:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录用户:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
bash脚本:面向过程的编程中
顺序执行:默认法则,逐条执行各语句
选择执行:分支,条件判断,符合条件的分支予以执行;
循环执行:将同一段代码反复执行有限次,所以,循环必须有退出条件,否则将陷入死循环;
for循环:
for var_Name in 列表; do
语句1
语句2
...
done
语法错误检测:
# bash -n 脚本文件
列表的生成方法:
生成数字序列:{start..end}、seq [start] [step] end
练习:写一个脚本,列出1-10的奇数
#!/bin/bash
for num in `seq 1 2 10`;
do
echo $num
done
练习:写一个脚本,用file命令显示/var/log目录下每个文件的内容类型;
提示:列表生成的方法为/var/log/*
#!/bin/bash
#
dirName=/var/log
for fileName in $dirName/*; do
file $fileName
done
练习:写一个脚本,
1、创建/tmp/scripttest目录,用变量保存目录名;
2、在目录里创建测试文件tfile1-tfile20;
3、创建用户testuser1和testuser2;
4、将tfile1-tfile10的属主和属组改为testuser1;
5、将tfile11-tfile20的属主和属组改为testuser2;
#!/bin/bash
dirName=/tmp/scripttest
mkdir $dirName
for fileNo in {1..20}; do
touch $dirName/tfile$fileNo
echo "Create $dirName/tfile$fileNo finished"
done
useradd testuser1
useradd testuser2
for fileNo in {1..10}; do
chown testuser1:testuser1 $dirName/tfile$fileNo
done
for fileNo in {11..20}; do
chown testuser2:testuser2 $dirName/tfile$fileNo
done
文本处理类的命令:wc, word count
wc [option] [file]...
-l: 统计行数
-c: 统计字节数
-w;统计单词数
tr: 转换字符或删除字符
tr '集合1' '集合2' 将集合1替换为集合2
tr -d '字符集合' 删除字符集合
cut -d字符 -f# 操作对象
-d字符:指定分隔符
-f#: 指定要显示字段
单个数字:一个字段
逗号分隔的多个数字:指定多个离散字段
-:连续字段,如3-5;
sort: 默认按字符进行比较
sort [option] file...
-f: 忽略字符大小写;
-n: 比较数值大小;
-u: 重复的行,只显示一次;
-t: 指定分隔符
-k: 指定分隔后进行比较字段
uniq: 移除重复的行
-c:显示每行重复的次数
-d:仅显示重复过的行
-u: 仅显示不曾重复的行
练习:
1、统计/bin、/usr/bin、/sbin和/usr/sbin等各目录中的文件个数;
# ls /bin | wc -l
2、显示当前系统上所有用户的shell,要求,每种shell只显示一次;
# cut -d: -f7 /etc/passwd | sort -u
3、取出/etc/passwd文件的第7行;
# head -7 /etc/passwd | tail -1
4、显示第3题中取出的第7行的用户名;
# head -7 /etc/passwd | tail -1 | cut -d: -f1
# head -7 /etc/passwd | tail -1 | cut -d: -f1 | tr 'a-z' 'A-Z'
5、统计/etc目录下以P或p开头的文件个数;
# ls -d /etc/[Pp]* | wc -l
练习:写一个脚本,用for循环实现
显示/etc/init.d/functions、/etc/rc.d/rc.sysinit和/etc/fstab各有多少行;
#!/bin/bash
for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do
wc -l $fileName
done
#!/bin/bash
for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do
lineCount=`wc -l $fileName | cut -d' ' -f1`
echo "$fileName: $lineCount lines."
done
#!/bin/bash
for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do
echo "$fileName: `wc -l $fileName | cut -d' ' -f1` lines."
done
练习:写一个脚本
将上一题中三个文件的复制到/tmp目录中;
用for循环实现,分别将每个文件的最近一次的修改时间改为2011年9月15号13点27分;
#!/bin/bash
for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do
cp $fileName /tmp
baseName=`basename $fileName`
touch -m -t 201109151327 /tmp/$baseName
done
练习:写一个脚本
显示/etc/passwd中第3、7和11个用户的用户名和ID号;
#!/bin/bash
#
for lineNo in 3 7 11; do
userInfo=`head -n $lineNo /etc/passwd | tail -1 | cut -d: -f1,3`
echo -e "User: `echo $userInfo | cut -d: -f1`\nUid: `echo $userInfo |cut -d: -f2`"
done
for:通过使用一个变量去遍历给定列表中的每个元素,在每次变量赋值时执行一次循环体,直至赋值完成所有元素退出循环;
总结:生成列表的方式
1、直接给出列表;
2、使用文件名通配的机制生成列表
3、可以使用{}或seq命令生成数字序列 1, $lineCount `seq 1 $lineCount` {1..$lineCount}
4、使用命令生成