SHELL基础
1、ls命令
-a all显示隐藏文件 -F classify区分显示文件类型,若为目录则会在末尾添加一个/ -h human以容易查看的方式显示大小,即使用K、M、G作为单位 -i inode显示每个文件的inode -l list显示长列表 -r reverse反向显示,该属性常与t-时间,S大小等联合使用 -R recursive循环显示子目录 -s size显示文件块大小 -S sort-size以文件大小排序 -t sort-time以时间进行排序 -u 显示上次查看时间,而不是修改时间
2、cp命令
-l 创建硬链接
-p 保留文件属性
3、ln命令
创建一个软链接。
ln -s sourceFile destFile
4、df命令
df -h 可以方便的查看各挂载点的磁盘空间
5、du命令
用于查看目录下的所有文件、目录占用的空间信息。
-c 生成所有已列出文件的汇总(将当前目录所有内容汇总成一个total) -h 以可读的方式显示所占用空间 -s 汇总各自变量(如将目录汇总成一项)
du -sh * #统计当前各目录项所占空间
6、sort命令
排序命令,可以直接指定文件,然后可以按照排序输出文件内容(默认按照字典顺序)
-n 转换成数值进行排序(每行的前面部分会被转换成字符,然后排序) -o 保存输出到文件中 -r 反转排序 -f 忽略大小写 -u 指定排序的唯一,重复的只显示第一条记录
-s 禁止重排序(默认排序完成一个字段后会继续排序其他字段) -k pos1,[pos2] 根据pos1进行排序,并且在pos2位置结束 -t 与-k选项联合使用,指定用于分割字段的字符
sort -t : -k 3 -r /etc/passwd 则将文件按照:进行分割,然后按照第三个关键字进行反转排序
du -sh * | sort -nr 先使用du命令合并输出,然后采用数值解释进行反转排序
1) 默认情况下,sort依次对各字段进行排序(使用asc字符顺序),排完第一,排第二,依次类推
2)采用数值排序,使用-n选项,若使用-k指定排序字段,只有首个字段能够按照数值,如:
sort sortfile.txt -k2,3n ///本意,指定按照2,3两个字段数值排序,但是只对第二字段数值排序,第三字段采用字符排序
sort sortfile.txt -k2n -k3n ///采用两个-kn命令来实现上述效果
3)禁止重排,默认按一个字段排序后,还会调到其他字段继续排序,可以使用-s
7、grep命令
用于搜索文件中匹配模式的行
-v 搜索不匹配模式的行 -n 同时显示行号 -c 统计符合条件的行数 -e 搜索的模式,可以使用多个该选项指定多个搜索模式
--binary-files=text 用于搜索二进制文件时
8、date命令
1)打印日期 date +%Y%m%d%h%m%s
2) 日期计算 date -d "[+-] year/month/day/hour/min/sec"
8、压缩文件
bzip2 .bz2, 压缩、查看、解压(bzip2,bzcat,hunzip2) gzip .gz, (gzip,gzcat,gunzip) zip .zip (zip,unzip)
tar 命令 tar -cvf filename.tar filename tar -xvf filename.tar tar -xzvf filename.tar.gz / filename.tgz
tar -tf filename.tar 列出文件包的内容,但是不解压
9、环境变量
分为本地环境变量与全局环境变量。
1)printenv用于显示全局环境变量、set用于显示所有环境变量
2)设置本地环境变量直接使用 xxx=xxx即可(注意等号两边不能有空格,等号右边若有空格需要使用引号),使用 $xxx方式引用,使用export xxx方式导出到全局环境变量,unset用于删除环境变量。
本地环境变量只在当前bash进程有效,而全局在自身以及子进程中都有效。
3)数组 xxx=(xx,xx,xx),使用echo $xxx只引用第一个值,echo ${xxx[1]},echo ${xxx[*]} 用于引用其他值与所有值。
4)登陆shell发布的环境变量
登陆shell时: /etc/profile $HOME/.bash_profile $HOME/.bash_login $HOME/.profile 交互式shell时: $HOME/.bashrc
5)交互式读取变量
echo -n "Please enter you name:" read name echo "Your name is :"$name
6)读取文件行到变量之中
read variable 默认从标准输入读取一行保存到variable之中,但是可以使用输入重定向将文件一行行地读取到变量中。
read message < ./nor.log ##只能读取一行保存到变量中 while read message do echo $message done < ./nor.log ##使用输入重定向循环读取
7)命令替换
var=`express`
var=$(express)
8)预定义变量
PPID 父进程ID
$$ 自身的进程ID
RANDOM 产生在0~32767之间的随机数
SECONDS 返回shell运行经过的秒数
HOME 当前用户的主目录
IFS (Internal Field Separator)当成空格使用的字符集合(用于分隔符) IFS=$'\n' IFS=":"
10、关于文件权限
对于新创建的文件都有一个权限,这个权限可以通过umask来设置。
umask表示要屏蔽的权限。
权限的读、写、执行,分别为1、2、4,因此若一个文件具有这三个权限也就是8;
创建时文件的权限最大为666(没有执行权限,执行权限需要通过chmod +x 方式添加),然后减去umask的值,最终就得到新创建文件的权限。
创建时目录的权限最大为777,然后减去umask的值,最终就得到新创建目录的权限。
1. 基本脚本编译
1)使用逗号可以分隔多条命令同时执行 date ; who
2)SHELL脚本
首行为 #!/bin/bash
使用echo显示消息,默认每次显示后添加换行符,可以使用 -n 参数禁止
提取变量使用$前缀,赋值直接引用名称即可
使用反引号,可以将其中命令的输出赋值给变量
重定向:>,>>, <表示将文件内容作为输入, command << marker data marker 表示将两个marker之间的数据作为输入
数学计算
计算整数:使用bash表达式如 $[] 中括号中的表达式将被计算
计算浮点:使用bc命令
echo “” | bc 将引号中的数据传递给bc var=`bc << EOF expressions EOF `
脚本的退出状态,在执行完一条命令后使用 $? 可以查看,在脚本中可以使用exit code指定退出状态。
3、基本的if-else语句
if command then commands else commands fi
也可以放在同一行,但是在if语句后,then语句后都需要添加分号:if [ 10 -le 11 ]; then echo "le"; fi
默认if检查command命令执行的退出状态,若为0则表示条件符合执行then后面的语句。
嵌套方式:
if command then commands elif command2 #嵌套了一个elif语句判断与if一样 then commands fi
4、条件判断
使用test或者中括号(左右都需要留出空格)
if [ condition ] then commands fi
1)整数比较 -eq、-ge、-gt 等于、大于等于、大于;
-ne、-le、-lt 不等于、小于等于、小于
2)字符串比较 =、!=、<, > , -n(长度大于零), -z(长度等于零)
注意:大于小于号需要使用转义符号
比较依据ASC2编码进行(小写大于大写),而sort正好相反。
3)文件比较
-d file 是否存在目录 -e file 检查file是否存在 -f file 是否存在文件 -s file 文件存在并且不为空 -r -w -x 文件存在以及权限检查 file1 -nt file2 比较file1是否比file2新 -ot 相反
4)符合条件检查 [] && [] 或者 [] || []
5)使用双圆括号进行高级数学计算,使用双中括号可进行模式匹配
5、case命令
三、case命令
case variable in pattern | pattern) command;; pattern) command;; *) default commands;; esac #注意每个匹配结束执行的命令后需要使用两个分号
四、for命令
for var in list do commands done
list里面是一个列表,var将依次从其中取值,然后执行commands。
列表中的值默认采用空格进行分割,若是对字符串按单词分割则要注意单引号与双引号(可使用转义符号)。
改变字段分隔符 默认字段分隔符为:空格、制表符、换行符 可通过修改IFS环境变量 IFS=$'\n' IFSOLD=$IFS IFS=$'\n' commands IFS=$IFSOLD
使用目录通配符 for file in /Users/zhongchangshou/Documents/workspace/shell/* do if [ -d "$file" ] ;then echo "$file is a directory"; elif [ -f "$file" ] ;then echo "$file is a file"; fi done #注意:得到的file可能包括空格,因此在用于判断时应该加上引号,作为整体
五、while/until命令
while test command do other commands done
until test commands do other commands done #while与until的区别仅仅在于条件的判断上,until在判断返回false执行,while相反