首页 > 系统服务 > 详细

shell 学习笔记1

时间:2019-06-26 14:04:52      阅读:116      评论:0      收藏:0      [点我收藏+]

一、介绍

  1、什么是shell

    shell是一个命令计时器,他在操作系统得最外层,负责直接与用户对话,把用户得输入解释个OS,并处理各类操作系统得输出结果,输出到屏幕返回个i用户,这种对话方式可以是交互方式(键盘输入命令,可以立即得到shell得回应),或非交互式(执行脚本程序)得方式

    图示如下:

技术分享图片

  2、什么是shell脚本

    其实就是通过一个程序文件执行的程序,可以由一系列命令及命令语句组成,这些命令、变量和流程控制语句等有机得综合形成一个功能强大得shell脚本,类似dos系统下得批处理文件批处理示例如下:(备份网站数据库脚本)

@echo off
set date=%date:~0,4%-%date::~5,2%-%date:~8,2%
mysqldump -uroot -poldboy -A -B >D:\bak\"%date%.sql"
rar.exe a -k -r -s -ml D:\bak\"%date%".sql.rar D:\bak\"%date%".sql
del D:\bak\*.sql
rar.exe a -k -r -s -ml d:\bak\"%date%" htdocs.rar D:\work\PHPnow\htdocs

 

    

  3、shell在工作中位置

技术分享图片

  4、shell的种类

  shell 脚本语言是弱类型语言,较为通用shell 有标准的Bourne shell (sh)和C shell(csh),其中Bourne shell(sh)已经被bash shell 取代

    bourne shell(sh,ksh,an bash)
    bourene shell(sh)
    bourne again shell (bash)
    POSIX shell (sh)

    c shell
    c shell (csh)
      TENEX/TOPS C shell (tcsh)

  查看系统得shell

 

[root@web1 ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

   用的最多得莫属bash了,bash是bourne again shell的缩写,bash是 bourne shell(sh)发展来的,但又不完全相同,它包含了csh和ksh的特色,但大多数脚本都可以不加修改的在bash上运行,是bourne shell的扩展,增加了一些特性,命令补全,命令编辑和命令历史等

  5、其他常用脚本语言种类

    php

    perl

    python

    js

  6、第一个shell脚本

    

#!/bin/bash
echo "Hello World !"


[root@web1 bash-test]# chmod +x 1.sh   #添加运行权限
[root@web1 bash-test]# 1.sh        #这样运行不了,因为运行其它二进制的程序也一样,直接写 1.sh,linux 系统会去 PATH 里寻找有没有叫 1.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 1.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
[root@web1 bash-test]# ./1.sh
hello world!
[root@web1 bash-test]# bash 1.sh    #这是另一种方式,指定解释器直接运行
hello world!
[root@web1 bash-test]# 

 

 

二、shell文件测试表达式

  1、文件测试表达式用法

    在处理一个对象的时候,需要对对象进行测试,只有符合要求,采取操作处理,这样做就可以避免程序出错及无畏的消耗,这个要测试的对象可以是文件,字符串,数字。

  2、文件测试操作符号

技术分享图片

  3、文件测试表达式举例

    1)普通文件

[root@www ~]# touch abc
[root@www ~]# ll abc
-rw-r--r-- 1 root root 0 Jan 22 20:43 abc
[root@www ~]# [ -f abc ]&&echo 1||echo 0   #如果存在echo 1 ,否则echo 0
1
[root@www ~]# 

 

    2)目录文件

[root@www ~]# mkdir dir
[root@www ~]# ll dir
total 0
[root@www ~]# [ -f dir ]&&echo 1||echo 0 
0
[root@www ~]# [ -e dir ]&&echo 1||echo 0  #只要存在就为真
1
[root@www ~]# [ -d dir ]&&echo 1||echo 0
1
[root@www ~]# 

    3)文件属性

[root@www ~]# [ -r abc ]&&echo 1||echo 0
1
[root@www ~]# [ -w abc ]&&echo 1||echo 0
1
[root@www ~]# [ -x abc ]&&echo 1||echo 0
0
[root@www ~]# chmod 000 abc               #root 用户不起作用,还是可读,可写
[root@www ~]# [ -r abc ]&&echo 1||echo 0
1
[root@www ~]# [ -w abc ]&&echo 1||echo 0
1
[root@www ~]# [ -x abc ]&&echo 1||echo 0
0
[root@www ~]# ll abc
---------- 1 root root 0 Jan 22 20:43 abc
#############切换用户测试#####################
[root@www ~]# useradd abc
[root@www ~]# cd /tmp
[root@www tmp]# touch abc
[root@www ~]# su abc
[abc@www /]$ cd /tmp
[abc@www tmp]$ [ -r abc ]&&echo 1||echo 0
0
[abc@www tmp]$ [ -d abc ]&&echo 1||echo 0
0
[abc@www tmp]$ [ -w abc ]&&echo 1||echo 0
0
[abc@www tmp]$ ll abc
---------- 1 root root 0 Jan 22 20:57 abc
文件的读写执行等属性,不光是根据文件属性,而是当前执行脚本的用户根据测试选项是否真的可操作

    4)测试shell变量例子

[root@www ~]#file1=/etc/services
[root@www ~]#file2=/etc/rc.local 
[root@www ~]# echo $file1
/etc/services
[root@www ~]# echo $file2
/etc/rc.local

    5)对单个文件变量测试,也可以测试实体文件路径

[root@www ~]# [ -f "$file1" ]&& echo 1 || echo 0
1
[root@www ~]# [ -d "$file1" ]&& echo 1 || echo 0
0
[root@www ~]# [ -s "$file1" ]&& echo 1 || echo 0
1
[root@www ~]# [ -e "$file1" ]&& echo 1 || echo 0
1

    6)对单个目录变量测试

    7)可以看看centos6的rpcbind启动脚本启用很多测试语法

    8)对比if,比判断语句简单

三、字符串测试表达式

  1、字符串测试表达式参数

    字符串需要用""引起来

    比较符号两段必须要空格

技术分享图片

  2、字符串测试表达式举例

    1)测试1

[root@www ~]# [ -z "012" ] && echo 1 || echo 0  #不为0 ,为假,所以echo 0
0
[root@www ~]# [ -z "" ] && echo 1 || echo 0      #为0,为真,所以echo 1
1
[root@www ~]# [ -n "" ] && echo 1 || echo 0      #为0,所以为假,所以echo 0
0
[root@www ~]# 

     2)测试2

[root@www ~]# test1=abc
[root@www ~]# [ "test1" = "abc" ] &&echo 1||echo 0    #不等于为真,所以 echo 0
0
[root@www ~]# [ "$test1" = "abc" ] &&echo 1||echo 0   #等于为真,所以echo 1
1
[root@www ~]# [ "$test1" != "abc" ] &&echo 1||echo 0  #不等于为真,所以 echo 0
0
[root@www ~]# 

    3)“=”号两段不加空格测试,不加引号也容易出问题

[root@www ~]# [ "abc"="1" ] &&echo 1||echo 0
1
[root@www ~]# [ "abc" = "1"  ] &&echo 1||echo 0
0

    4)可以参考centos7 上 /etc/rc.d/init.d/functions这个文件

三、整数二元比较操作符

  1、整数二元比较操作符参数

技术分享图片

  2、整数二元比较操作符举例

    1)测试1

[root@www ~]# [ 2 > 1 ]&&echo 1||echo 0
1
[root@www ~]# [ 2 < 1 ]&&echo 1||echo 0     #2不小于1,这个结果时错的,因为没有转义
1
[root@www ~]# [ 2\ < 1 ]&&echo 1||echo 0
1
[root@www ~]# [ 2 \< 1 ]&&echo 1||echo 0
0
[root@www ~]# 

    2)测试2,( [] 里面用字母的形式,[[]] 用符号的形式)

[root@www ~]# [[ 2 < 1 ]]&&echo 1||echo 0
0
[root@www ~]# [ 2 -lt 1 ]&&echo 1||echo 0
0
[root@www ~]# [ 2 -le 1 ]&&echo 1||echo 0
0
[root@www ~]# [ 2 -gt 1 ]&&echo 1||echo 0
1
[root@www ~]# [ 2 -ge 1 ]&&echo 1||echo 0
1
[root@www ~]# 

    3)测试总结

      1、整数加双引号也是对的

      2、[[]]用-eq等写法也是对的,[[]]用>等写法也可能不对(只比较第一位,逻辑结果不对)

      3、[]用>号的写法没错,但逻辑结果不对

    4)系统脚本例子

[root@xen-node1 ~]# grep -w "\-eq" /etc/init.d/nfs
        [ $RETVAL -eq 0 ] && RETVAL=$rval
                [ $RETVAL -eq 0 ] && RETVAL=$rval
                [ $RETVAL -eq 0 ] && RETVAL=$rval
        [ $RETVAL -eq 0 ] && RETVAL=$rval
                [ $RETVAL -eq 0 ] && RETVAL=$rval
[root@xen-node1 ~]# 

 

四、逻辑操作符号

  1、逻辑操作符号参数

技术分享图片

  2、注意

    !中文意思是反:与一个逻辑值相反的逻辑值

    -a中文意思是与(and&&):两个逻辑值都为真,返回值才为真,反正为假

    -o中文意思是或(or||):两个逻辑值只要有一个为真,返回值就为真

  3、逻辑操作符运算规则

    结论:-a和&&的运算规则:只有两段都是1才为真

true 1false 0
------------------------
and 1*0=0 假
and 0*1=0 假
and 1*1=1 真
and 0*0=0 假
只有两段都是1才为真,and交际
结论:-o或||两端都是0才为假,任何一端不为0都是真
---------------------------
or 1+0=1 真
or 1+2=2 真
or 0+1=1 真
or 0+0=0 假
两端都是0才为假,不为0都是真
或并集

  4、逻辑操作符示例

    1)测试1

[root@www ~]# f1=/etc/rc.local ; f2=/etc/services
[root@www ~]# [ -f "$f1" -a -f "$f2"]&& echo 1||echo 0 #括号里面没加空格
-bash: [: missing `]0
[root@www ~]# [ -f "$f1" -a -f "$f2" ]&& echo 1||echo 0  #为真
1
[root@www ~]# [[ -f "$f1" && -f "$f2" ]]&& echo 1||echo 0 #用&&需要加双括号
1
[root@www ~]# [ -f "$f1" && -f "$f2" ]&& echo 1||echo 0 #不加双括号报错
-bash: [: missing `]0
[root@www ~]# [ -f "$f1" ] && [ -f "$f2" ]&& echo 1||echo 0 #这样也可以
1
[root@www ~]# 

     2)测试2

[root@xen-node1 ~]# sed -n 87,90p /etc/init.d/nfs
        [ "$NFSD_MODULE" != "noload" -a -x /sbin/modprobe ] && {
                /sbin/modprobe nfsd
                [ -n "$RDMA_PORT" ] && /sbin/modprobe svcrdma
        }
You have new mail in /var/spool/mail/root
[root@xen-node1 ~]# 

    3)总结

[]中用-a,-o,!
[[]]中用&&,||,!
test用法和[]相同
多个[]之间以及多个[[]]之间,或者任意混合中间逻辑操作符都是&&或||

 

 

 

转载请注明出处:https://www.cnblogs.com/zhangxingeng/p/11064571.html 

shell 学习笔记1

原文:https://www.cnblogs.com/zhangxingeng/p/11064571.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!