Linux Shell的简单使用

2019-04-15  本文已影响0人  喵星人ZC

一、Vim命令的简单使用请参考

VIM常用命令汇总

二、Shell编程规范

1)shell文件行业规范默认后缀为.sh
2)shell首行为 
#!/bin/bash
注意/bin/bash为当前脚本解释器,可以不写但不能写错了。
3)#表示注释
4)shell对大小写敏感,变量尽量全大写

三、变量

1、环境变量

全局生效
通过set命令查看
用户环境变量,当前用户生效
系统环境变量,所有用户生效
通过export声明变

2、位置变量
将脚本的参数传给脚本,多个参数使用空格隔开

$0: 获取脚本文件名称
$1、$2....$9 :执行脚本的参数
-----------------------------------------------------------------
用例 
[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
echo "$0"
echo "$2"
echo "$3"
echo "$1"

-------------------------------------------------------------------------
[hadoop@hadoop000 script]$ sh test.sh oneParm
test.sh


oneParm

3、预定义变量
由系统保留和维护的一组特殊变量

$0  :  获得当前脚本的名称

用例演示
###########
cat test.sh 
#!/bin/bash
echo $0
############
[hadoop@hadoop000 script]$ sh test.sh 
test.sh

---------------------------------------------------------------
$!  :  后台运行的最后一个进程的PID
---------------------------------------------------------------
$?  :  上一个命令退出的状态(0:成功,非0:失败)
---------------------------------------------------------------
$*  :  当前shell参数集合(整体)
---------------------------------------------------------------
$$  :  表示当前进程ID号码
---------------------------------------------------------------
$#  :  代表当前shell的参数个数
---------------------------------------------------------------
$@  :  当前shell参数集合(逐个读取)

4、自定义变量

变量命令格式:
-------------------------------
变量名=变量值
-------------------------------
注意:
1、等号两边不能有空格
2、变量名大小写敏感,官方建议大写
-------------------------------
变量取值:$变量名 或${变量名}

四、算数运算

常用运算符:

+ - * / % 

语法格式

$((expression)) 或
$[expression] 或
expr expression

用例:

[hadoop@hadoop000 script]$ echo $((10+10))
20
[hadoop@hadoop000 script]$ echo $[10+10]
20
[hadoop@hadoop000 script]$ echo 10+10
10+10

五、比对符

数值常用比对符:

-eq 等于,equal
-------------------------------
-ne 不等于,not equal
-------------------------------
-gt 大于,greate than
-------------------------------
-ge 大于等于,greate than or equal
-------------------------------
-lt 小于,less than
-------------------------------
-le 小于等于,less than or equal

字符串常用比对符:

=  等于
-------------------------------
!= 不等于
-------------------------------
-z 长度为零,如:  [ -z "$myvar" ] 
-------------------------------
-n 长度为零,如:  [ -z "$myvar" ] 

\color{red}{注意}
\color{red}{1、字符串比较时可以用=也可以用==,左右离比较符必须有空格}
\color{red}{2、等于“=”不仅可以用来比较字符串也可以比较数字,注意要有空格,否则就是赋值了。}

六、文件判断

文件判断

-e 文件名,文件存在为真
-r 文件名,文件存在且可读为真
-w 文件名,文件存在且可写为真
-x 文件名,文件存在且可执行为真
-s 文件名,文件存在且有一个字符为真
-d 文件名,文件存在且为目录为真,目录ll显示为d
-f 文件名,文件存在且为普通文件为真,普通文件类型为-
-c 文件名,文件存在且为字符串型特殊文件为真,几乎不用使用到。ll /dev/ 可查看c类型文件
-b 文件名,文件存在且为块特殊文件为真,几乎不会使用到。ll /dev/ 可查看b类型文件

七、Date的使用

1、date 获取以及零时修改当前时间

[hadoop@hadoop000 script]$ date 
Sun Apr 14 23:29:29 CST 2019
[hadoop@hadoop000 script]$ date -s "2019-04-10 02:20:57"
date: cannot set date: Operation not permitted
Wed Apr 10 02:20:57 CST 2019

2、修改date的输出格式

[hadoop@hadoop000 script]$ date '+%Y%m%d%H%M%S'
20190414233226

[hadoop@hadoop000 script]$ date +"%Y-%m-%d" 
2019-04-14

3、Date加减运算

[hadoop@hadoop000 script]$ date +"%Y年%m月%d日"
2019年04月14日

[hadoop@hadoop000 script]$ date '+%Y%m%d%H%M%S' -d'-1 day'  
20190413234358

[hadoop@hadoop000 script]$ date +"%Y年%m月%d日" -d'-1 day'  
2019年04月13日


[hadoop@hadoop000 script]$ date +"%Y年%m月%d日" -d'-1 week'    
2019年04月07日

[hadoop@hadoop000 script]$ date +"%Y年%m月%d日" -d'-1 year'       
2018年04月14日

八、数组

语法结构

变量名=(元素1 元素2 元素3 元素4 元素5 元素6 )
注意 默认元素间是以空格分隔

用例1:

[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
arr=(ruoze jepson xingxing wsk shiqi)
for i in ${arr[@]}
do
        echo $i
done
--------------------------------------------------------------------------------------
[hadoop@hadoop000 script]$ sh test.sh 
ruoze
jepson
xingxing
wsk
shiqi

用例2:字符串间使用逗分隔,OLD_IFS,IFS这些事固定写法,分隔字符串

[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
S="ruoze,jepson,xingxing,wsk,shiqi"
OLD_IFS="$IFS"
IFS=","
arr=($S)
IFS="OLD_IFS"
for i in ${arr[@]}
do
        echo $i
--------------------------------------------------------------------------------------

[hadoop@hadoop000 script]$ sh test.sh 
ruoze
jepson
xingxing
wsk
shiqi

九、控制语句

1、 for循环
语法1:

for 变量 in 集合
do
逻辑
done

语法2:

for((初始变量;结束循环调节;变量))
do
逻辑
done

语法1用例:

[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
for i in tony jet bob
do
echo $i
echo "hello $i"
done
--------------------------------------------------------------------------------------
[hadoop@hadoop000 script]$ sh test.sh 
tony
hello tony
jet
hello jet
bob
hello bob

语法2用例(注意 {1..10} 可以用seq 10取代):

[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
for i in {1..10}
do
mkdir dir$i
done
--------------------------------------------------------------------------------------
[hadoop@hadoop000 script]$ sh test.sh 
[hadoop@hadoop000 script]$ ll
total 44
drwxrwxr-x 2 hadoop hadoop 4096 Apr 15 22:32 dir1
drwxrwxr-x 2 hadoop hadoop 4096 Apr 15 22:32 dir10
drwxrwxr-x 2 hadoop hadoop 4096 Apr 15 22:32 dir2
drwxrwxr-x 2 hadoop hadoop 4096 Apr 15 22:32 dir3
drwxrwxr-x 2 hadoop hadoop 4096 Apr 15 22:32 dir4
drwxrwxr-x 2 hadoop hadoop 4096 Apr 15 22:32 dir5
drwxrwxr-x 2 hadoop hadoop 4096 Apr 15 22:32 dir6
drwxrwxr-x 2 hadoop hadoop 4096 Apr 15 22:32 dir7
drwxrwxr-x 2 hadoop hadoop 4096 Apr 15 22:32 dir8
drwxrwxr-x 2 hadoop hadoop 4096 Apr 15 22:32 dir9

2、while循环
语法1:

while [条件]
do
逻辑
done

语法2:

while read -r line
do
逻辑
done

语法1用例:

[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
i=0
sum=0
while [ $i -lt 10 ]
do
sum=$(($sum+$i))
i=$[$i+1]
done
echo $sum
--------------------------------------------------------------------------------------
[hadoop@hadoop000 script]$ sh test.sh 
45

语法2用例\color{red}{[读取文件的每一行]}

[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
while read -r line
do
echo $line
done < test.sh
--------------------------------------------------------------------------------------
[hadoop@hadoop000 script]$ sh test.sh 
#!/bin/bash
while read -r line
do
echo $line
done < test.sh

语法2用例\color{red}{[读取文件的每一行,并取第一列和hello拼接]}

[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
while read -r line
do
echo `echo $line | awk -F: '{print $1}'`:hello 
done < /etc/passwd
--------------------------------------------------------------------------------------
[hadoop@hadoop000 script]$ sh test.sh 
root:hello
bin:hello
daemon:hello
adm:hello
lp:hello
sync:hello
shutdown:hello
halt:hello
mail:hello
uucp:hello
operator:hello
games:hello
gopher:hello
ftp:hello
nobody:hello
dbus:hello
usbmuxd:hello
vcsa:hello
rpc:hello
rtkit:hello
avahi-autoipd:hello
abrt:hello
rpcuser:hello
nfsnobody:hello
haldaemon:hello
gdm:hello
ntp:hello
apache:hello
saslauth:hello
postfix:hello
pulse:hello
sshd:hello
tcpdump:hello
hadoop:hello
mysql:hello

3、if条件判断
语法1

if 条件
then
   逻辑
fi

语法2

if 条件
then
   逻辑
else
   逻辑
fi

语法3

if 条件
then
    逻辑
elif
then
    逻辑
else
    逻辑
fi  

语法1用例:

[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
if [ 2 -eq 2 ]
then
echo yes
else
echo no
fi
----------------------------------------------------
[hadoop@hadoop000 script]$ sh test.sh 
yes

4、case 条件选择
语法

case $变量名称 in
条件1)
    命令序列
    ;;
条件2)
    命令序列
    ;;
条件3)
    命令序列
    ;;
*)
esac

用例:

[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
case $1 in
1)
        echo "我是"$1
        ;;
2)
        echo "我是"$1
        ;;
3)
        echo "我是"$1
        ;;
*)
        echo "我是"$1
        ;;
esac
-------------------------------------------------
[hadoop@hadoop000 script]$ sh test.sh jack
我是jack

十、函数

语法

function name{
    方法体
}

-----------------------或者-----------------------------

name(){
    方法体
}

用例:

[hadoop@hadoop000 script]$ cat test.sh 
#!/bin/bash
sum(){
        echo $(($1+$2))
}

sum 2 7
-----------------------------------------
[hadoop@hadoop000 script]$ sh test.sh 
9

十一、awk 文件扫描

语法:

awk '{pattern + action}' {filenames}

用例1:\color{red}{输出第一行,NR表示行号}

[hadoop@hadoop000 script]$ cat data.log 
1,a,欢
2,b,迎
3,c,您
------------------------
[hadoop@hadoop000 script]$ cat data.log| awk -F "," 'NR==1' 
1,a,欢

用例2:\color{red}{输出第一行之后的所有行}

[hadoop@hadoop000 script]$ cat data.log| awk -F "," 'NR>1' 
2,b,迎
3,c,您

用例3:\color{red}{输出第一列和第二列}

[hadoop@hadoop000 script]$ awk -F "," '{print $1,$2}' data.log 
1 a
2 b
3 c

用例4:\color{red}{输出第2列第二行}

awk -F "," 'NR==2{print $2}' data.log 

十二、sed 流编辑器(替换)

语法:

sed [options] 'command' file(s)

用例1:\color{red}{1替换成a}

[hadoop@hadoop000 script]$ cat data.log 
1,a,欢
2,b,迎
3,c,您
------------------------------
[hadoop@hadoop000 script]$  sed -i 's/1/a/' data.log
[hadoop@hadoop000 script]$ cat data.log 
a,a,欢
2,b,迎
3,c,您

\color{blue}{注 :sed -r 's/1/a/' data.log 不会真正得到修改文件,但会输出替换后的内容到控制台,所以可以 -r 测试}

用例2:\color{red}{全文本a替换成aa} \color{blue}{-g为全局参数}

[hadoop@hadoop000 script]$ cat data.log 
a,a,欢
2,b,迎
3,c,您
[hadoop@hadoop000 script]$  sed -i 's/a/aa/g' data.log  
[hadoop@hadoop000 script]$ cat data.log 
aa,aa,欢
2,b,迎
3,c,您

用例3:\color{red}{在每行行首添加 -- 字符串}

[hadoop@hadoop000 script]$ cat data.log 
aa,aa,欢
2,b,迎
3,c,您
[hadoop@hadoop000 script]$ sed -i 's/^/--&/g' data.log 
[hadoop@hadoop000 script]$ cat data.log 
--aa,aa,欢
--2,b,迎
--3,c,您

用例4:\color{red}{在每行行尾添加 $$ 字符串}

[hadoop@hadoop000 script]$ cat data.log 
--aa,aa,欢
--2,b,迎
--3,c,您
[hadoop@hadoop000 script]$ sed -i 's/$/&$$/g' data.log     
[hadoop@hadoop000 script]$ cat data.log 
--aa,aa,欢$$
--2,b,迎$$
--3,c,您$$
上一篇下一篇

猜你喜欢

热点阅读