(shell篇)Linux之shell基础

&&和||
&&用来执行条件成立后执行的命令
||用来执行条件不成立后执行的命令
例如:
ping -c 1-w 1 172.25.254.6 &&echo up ||echo no

(shell篇)Linux之shell基础

test 命令:

test 命令和[]等同
test "$A" == "$B" 等同于 [ "$A" == "$B" ]
 

[ "$A" = "$B" ] A=B
[ "$A" != "$B" ] A不等于B的数值时候为真
[ "$A" -eq "$B" ] A=B
[ "$A" -le "$B" ]  A小于B结果为真
[ "$A" -lt "$B" ] A小于B结果为真

实验:

(shell篇)Linux之shell基础

[ "$A" -ge "$B" ] A的数值大于等于B的数值为真
[ "$A" -gt "$B" ] A的数值大于B的数值
[ "$A" -ne "$B" -a "$A" -gt "$B" ] A的数值不等于B且A 大于B
[ "$A" -ne "$B" -o "$A" -gt "$B" ] A的不等于B且A大于B
[ -z "$A" ] 输入为空为真
[ -n "$A" ] 输入不为空为真
[ "file1" -ef "file2" ] 文件1和文件2是一样的
[ "file1" -nt "file2" ] 文件1比文件二新
[ "file1" -ot "file2" ] 文件1比文件2老

(shell篇)Linux之shell基础

[ -z "$1" ]的用法:

vim test.sh     ###编辑一个脚本文件,文件内写入:

(shell篇)Linux之shell基础

表示的是如过前面的输入是空的话输出yes,输入不为空的时候输出no

测试:
sh test.sh

(shell篇)Linux之shell基础

而[ -n "$1" ]&&echo yes ||echo no的效果刚好相反,在这里就不再赘述,读者可以自己编辑脚本测试。

[ "file1" -ef "file2" ]的用法:

1>ln /script/westos /script/westos1

2>[ "westos" -ef "westos1" ]&&echo yes ||echo no     ###文件westos和文件westos1是不是一样,一样的话输出yes,不一样输出no

(shell篇)Linux之shell基础

(shell篇)Linux之shell基础

[ "file1" -ot "file2" ]的用法:

1>前后创建两个文件 

(shell篇)Linux之shell基础

用[ "redhat" -ot "redhat1" ]&&echo old||echo no old     命令进行比较,结果:

(shell篇)Linux之shell基础

这是有人会怀疑这个命令是比较时间的吗?是不是比较文件名或者其他的东西了,如果同时创建两个文件:

(shell篇)Linux之shell基础

这是再用命令来比较它们两个文件的新旧:(可以从下面的实验看出它们的比较结果是不新不旧,与猜想一致。)

[ "test" -ot "test1" ]&&echo old||echo no old

[ "test" -nt "test1" ]&&echo new||echo no new

(shell篇)Linux之shell基础

[ -e "file" ]        目标文件存在
[ -f "file" ]         目标是文件类型
[ -L "file" ]        此文件是链接类型   
[ -S "file" ]       目标是套接字类型
[ -b "file" ]        目标是块设备
[ -d "file" ]        目标是个目录
[ -c "file" ]        目标是字符设备

测试:编辑一个脚本文件check_file.sh,作用是:检查文件类型。

#!/bin/bash
[ -e "$1" ]||{
        echo "Please input the path of file"
        exit
}
[ -L "$1" ]&&{
        echo "this file's type is Link"
        exit
}
[ -f "$1" ]&&{
        echo "this file's type is file"
        exit
}
[ -S "$1" ]&&{
        echo "this file's type is socket"
        exit
}
[ -b "$1" ]&&{
        echo "this file's type is block"
        exit
}

[ -d "$1" ]&&{
        echo "this file's type is directory"
        exit
}
[ -c "$1" ]&&{
        echo "this file's type is zifu"
        exit
}

(shell篇)Linux之shell基础

Complete!!

####grep a
grep命令扩展:
grep root passwd  ##查找passwd文件中的root字符
grep root passwd -i  ##查找passwd文件中的root字符,不区分大小写

(shell篇)Linux之shell基础
grep -i "\<root" passwd ##root字符前面的字符过滤掉,和前面一个实验比起来是testroot不会表红了,倒数第五行。

(shell篇)Linux之shell基础
grep -i "\<root\>" passwd ##字符前后都过滤 只会得到root字符

(shell篇)Linux之shell基础
grep -i "\<root$" passwd   ##以root字符结尾的字符过滤

(shell篇)Linux之shell基础
grep -iE "^root\>|\<root$" passwd   ###-E表示扩展

(shell篇)Linux之shell基础
grep -v表示反向查找

(shell篇)Linux之shell基础

命令:

grep -E "x*" westos  出现x的和任意字符的
grep -E "x?" westos  出现x的个数是1或者2的摘录出来更明显的用法是:
grep -E "x?y" westos 出现x的个数是1或者2出现y的个数是1的摘录出来
grep -E "x\>{?}" westos 以x结尾的那一行,但是显示的是全部
grep -E "x{3}y" westos x出现的次数 是3的那一行摘录出来
grep -E "x{1,3}y" westos x出现的次数是一到三次的那一行摘录出来
grep -E "x{,3}y" westos x少于三次的行数摘录出来
grep -E "(ab){2,}" westos  ab出现两次以上的摘录出来

命令测试:

grep -E "x*" westos  出现x的和任意字符的

(shell篇)Linux之shell基础
grep -E "x?y" westos  出现x的个数是0或者1的(词段)摘录出来更明显的用法是:这个词段需要好好理解

(shell篇)Linux之shell基础
grep -E "x\>$" westos 以x结尾的那一行,但是显示的是全部

(shell篇)Linux之shell基础
grep -E "x{3}y" westos x出现的次数 是3的那一行摘录出来

(shell篇)Linux之shell基础
grep -E "x{1,3}y" westos x出现的次数是一到三次的那一行摘录出来

(shell篇)Linux之shell基础
grep -E "x{,3}y" westos x少于三次的行数摘录出来

(shell篇)Linux之shell基础
grep -E "(xy){2,}" westos  xy出现两次以上的摘录出来

(shell篇)Linux之shell基础

cat命令延伸:

命令:

cat -b fstab 查看fstab文件的时候加上行号,行号忽略空白行
cat -n fstab 查看fstab文件的时候加上行号

命令用法:

cat -b fstab 查看fstab文件的时候加上行号,行号忽略空白行

(shell篇)Linux之shell基础
cat -n fstab 查看fstab文件的时候加上行号

(shell篇)Linux之shell基础

sed命令:
sed -n /^#/p fstab    ###查看以#开头的行

(shell篇)Linux之shell基础
sed -n '/^#/!'p fstab    ###查看文件不是以#开头的行

(shell篇)Linux之shell基础
cat -n fstab |sed -n '2,6p'   ##查看第二行到第六行

(shell篇)Linux之shell基础


 cat -n fstab |sed -n '6p'

(shell篇)Linux之shell基础
cat -n fstab |sed -n -e '6p' -e '2p'     查看第二行和第六行

(shell篇)Linux之shell基础
cat -n fstab |sed -n -e '6p;3p'    ###查看第二行和第6行

(shell篇)Linux之shell基础

sed '/^#/d' fstab    不显示以#开头的行数

(shell篇)Linux之shell基础
sed -e '/^#/d' fstab  和上面的效果一样

(shell篇)Linux之shell基础


sed '/^#/chello\nwestos' fstab    ###将文件中以#开头的行修改为hello\nwestos

(shell篇)Linux之shell基础

sed -n '/^#/w /mnt/testfile' fstab   ###将fstab文件中的以#开头的行输入到testfile文件中;此命令可以生成目标文件。

(shell篇)Linux之shell基础

(shell篇)Linux之shell基础

sed '1r /mnt/westos' fstab     ###将fstab文件中的内容加入到/mnt/westos文件中的第一行之后

(shell篇)Linux之shell基础

sed '/^UUID/aheelo' fstab    ###将fstab文件的以UUID开头的一行之后加上hello

(shell篇)Linux之shell基础

sed '/^UUID/ihello' fstab      ###给fstab文件的以UUID开头的一行之前加上hello

(shell篇)Linux之shell基础
sed 's/nologion/bash/g' passwd

(shell篇)Linux之shell基础
sed '1,5s/bash/nologin/g' passwd

(shell篇)Linux之shell基础
sed -e '5s/nologin/bash/g;3s/nologin/bash' passwd

(shell篇)Linux之shell基础
sed '/root/,/sync/s/mologin/bash/g' passwd

(shell篇)Linux之shell基础
sed 'G' passwd      ###给passwd文件的每一行后面加上空行

(shell篇)Linux之shell基础
 sed '$!G' passwd    ###最后一行不加空行

(shell篇)Linux之shell基础

实验:编写一个脚本,此脚本可以更改apache的端口:

1.查看apache的配置文件:

(shell篇)Linux之shell基础

Listen 80一行的特点是以Listen开头的,可以用下面一行命令修改配置文件里面的端口信息:

sed '/^Listen/cLinsten 8080' /etc/httpd/conf/httpd.conf

脚本:

(shell篇)Linux之shell基础

 测试:

(shell篇)Linux之shell基础

实验:编辑一个脚本,脚本运行可以将指定的文件里面的用户的名字建立出来,用另外一个密码文件为目标用户设置密码:

user_create.sh    user_name   user_passwd

注:shell中的for语法

for i in $(seq 1 10)

do
    echo ${i}westos
done

(shell篇)Linux之shell基础

测试:

(shell篇)Linux之shell基础

(shell篇)Linux之shell基础