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=$' '  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=$'
'

IFSOLD=$IFS
IFS=$'
'
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相反
  
 
 
原文地址:https://www.cnblogs.com/chang290/p/3524547.html