shell 基础
shell是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。在shell和计算机硬件之间还有一层东西那就是系统内核了。

一、变量
变量,说简单点就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据。就拿PATH来讲,这个PATH就代替了所有常用命令的绝对路径的设定。
可以使用echo命令显示变量的值。
使用env命令即可全部列出系统预设的全部系统变量。
env命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部变量都显示出来。
一些系统常用的变量:
PATH 决定了shell将到哪些目录中寻找命令或程序
HOME 当前用户主目录
HISTSIZE 历史记录数
LOGNAME 当前用户的登录名
HOSTNAME 指主机的名称
SHELL 前用户Shell类型
LANG 语言相关的环境变量,多语言可以修改此环境变量
MAIL 当前用户的邮件存放目录
PWD 当前目录
环境变量一般在etc/profile 文件中设置,
比如jdk
export JAVA_HOME=/usr/local/jdk1.7.0_25
export JRE_HOME=/usr/local/jdk1.7.0_25/jre
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
然后运行”source /etc/profile”就可以生效了

二、shell中的特殊符号
(1)通配符
在bash下,可以使用*来匹配零个或多个字符,而用?匹配一个字符。# :这个符号在linux中表示注释说明的意思,即”#”后面的内容linux忽略掉。
(2)输入输出从定向
输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,
而不是屏幕上。输入重定向的命令是<,输出重定向的命令是>,另外还有错误重定向2>,以及追加重定向>>。
(3)管道符
前面已经提过过管道符”|”,就是把前面的命令运行的结果丢给后面的命令。

三、查找,截取,排序,去重
(1)grep :过滤一个或多个字符
比如
#ps axu 显示所有进程
#ps aux|grep java ,只显示java进程
(2)cut :截取某一个字段
语法:cut -d “分隔字符” [-cf] n 这里的n是数字
-d :后面跟分隔字符,分隔字符要用双引号括起来
-c :后面接的是第几个字符
-f :后面接的是第几个区块
eg: cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

cat /etc/passwd |cut -d ":" -f 1  //以":"分割,然后取第1个数据块。
root
bin
daemon
adm
lp
sync
shutdown
halt
mail

(3)sort :用做排序
-t 分隔符 :作用跟cut的-d一个意思
-n :使用纯数字排序

-k  按第几列排序
-r :反向排序
-u :去重复
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4
这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格
以水果数量来排序,也就是以第二列来排序,如何利用sort实现?
sort -n -k 2 -t : facebook.txt

(4)head -5n /etc/passwd  显示前5条
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

#head -5n /etc/passwd |sort  显示前5条,并且排序
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
root:x:0:0:root:/root:/bin/bash

(6)、uniq :去重复的行,
-c :统计重复的行数,并把行数写在前面 常和sort组合使用
(7)、& :如果想把一条命令放到后台执行的话,则需要加上这个符号。通常用于命令运行时间非常长的情况。

三、shell脚本中的逻辑判断

if []; then
    command
else
    command
if

if中参数含义

[ -z STRING ] "STRING" 的长度为零则为真。
[ -f  file ]    如果文件存在
[ -d ...   ]    如果目录存在
[ int1 -eq int2 ]    如果int1等于int2   
[ int1 -ne int2 ]    如果不等于    
[ int1 -ge int2 ]    如果>=
[ int1 -gt int2 ]    如果>
[ int1 -le int2 ]    如果<=
[ int1 -lt int2 ]    如果<

if [ -z $1 ]
then
        echo '传入参数长度为0'
else
        echo '传入参数为'$1
fi

if [ -f './a.txt' ]
then
        echo 'file is exist'
else
        echo 'file not exist'
fi

if [ -d '/home/xx/xx' ]
then
        echo 'dir is exist'
else
        echo 'dir not exist'
fi

四、shell脚本中的循环

for( i in 'seq 1 5'); do
command
done

a=10;
while [$a >= 1]; do
echo  "$a";
a = $[$a-1];
done

五、shell脚本中的函数
function sum() {
sum = $[$1 + $2];
echo sum;
}

sum $1 $2
调用:
#./fun.sh 1 4
5