Shell编程基础

Shell介绍

Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。它类似于windows下的的cmd.exe。它接收用户命令,然后调用相应的应用程序,shell可以使命令行也就可以是图形界面,用来提供人机交互。

通配符

通配符可以理解为shell的特殊代号字符,通配符就是一类特殊符号的集合,在shell解释器中有特殊的含义。

通配符字符含义说明:

  ~   表示用户家目录

[root@linux-test etc]# pwd
/etc
[root@linux-test etc]# cd ~
[root@linux-test ~]# pwd
/root

  ``和$()  被``和()裹起来的命令先执行

[root@linux-test ~]# echo `ls`
anaconda-ks.cfg Desktop Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates Videos
[root@linux-test ~]# echo $(ls)
anaconda-ks.cfg Desktop Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates Videos
[root@linux-test ~]# echo ls
ls

  !历史  可以调用历史命令,也表示逻辑非(下面^部分说明)

[root@linux-test test]# history
1 pwd
2 history
[root@linux-test test]# !1      匹配历史命令编号
pwd
/root/test
[root@linux-test test]# !pwd    匹配最近一条历史
pwd
/root/test

  *   表示任意多个字符

[root@linux-test ~]# ls
anaconda-ks.cfg Desktop Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates Videos
[root@linux-test ~]# ls *.cfg              #查看以.cfg结尾文件和目录,之前字符任意全匹配
anaconda-ks.cfg initial-setup-ks.cfg

  ?   表示一个字符,可以多个?同时用

[root@linux-test test]# ls
123.txt 12.txt 1.txt 45ab.txt
[root@linux-test test]# ls ?.txt
1.txt
[root@linux-test test]# ls ??.txt
12.txt

  []   代表一个和,如[0-9]表示0-9十个数字,[1,3]表示1和3

[root@linux-test test]# ls
123.txt 12.txt 16.txt 1.txt 45ab.txt
[root@linux-test test]# ls 1[0-9].txt
12.txt 16.txt

  ^   表示取反,这个通配符必须要在[]中使用,如下显示不是以cfg结尾的文件和目录,^可以用!取代

[root@linux-test ~]# ls *[^cfg]
Desktop:
Documents:
Downloads:
Pictures:
Templates:
Videos:

  @   无意义,一般用来隔离字符串,一般用于文件内容中

  #   用于注释字符串,一般用于配置文件中的注释

  $   取值,一般用于变量取值

[root@linux-test test]# x=5
[root@linux-test test]# echo x
x
[root@linux-test test]# echo $x
5

  %   用来杀死一个进程

  &  后台执行命令

[root@linux-test test]# touch aaa.txt &
[1] 46465    &挂后台执行会反馈一个进程号

  &&  逻辑与,当前一个指令执行成功时,执行后一个指令

[root@linux-test test]# ls && pwd
123.txt 12.txt 16.txt 1.txt 45ab.txt aaa.txt
/root/test

  ||  逻辑或,当前一个指令执行失败时,执行后一个指令

[root@linux-test test]# lp || pwd
lp: Error - no default destination available.
/root/test
[root@linux-test test]# ls || pwd
123.txt 12.txt 16.txt 1.txt 45ab.txt aaa.txt

  ()  子进程运行命令

[root@linux-test test]# (y=6)
[root@linux-test test]# echo $y      #由于不是在当前进程中执行,所以无法查看变量

  +-*/=  运算符,多用于循环和判断语句中

  ''  硬引用,里面的字符无意义

  ""  软引用,具有变量置换功能

[root@linux-test test]# z=6
[root@linux-test test]# echo 'Num = $z'
Num = $z
[root@linux-test test]# echo "Num = $z"
Num = 6

  :  执行后永远为真

  echo $?  上一次执行命令的执行状态,0表示成功

[root@linux-test test]# ls
123.txt 12.txt 16.txt 1.txt 45ab.txt aaa.txt
[root@linux-test test]# echo $?
0
[root@linux-test test]# aaaa
bash: aaaa: command not found...
[root@linux-test test]# echo $?
127
[root@linux-test test]# :
[root@linux-test test]# echo $?
0

  {}  多个文件集合

[root@linux-test test]# ls
123.txt 12.txt 16.txt 1.txt 45ab.txt aaa.txt
[root@linux-test test]# ls {123.txt,12.txt}
123.txt 12.txt

  /    路径分隔符号

  >和>>     输出重定向导向,分别为"覆盖"与"累加"

变量

变量是用来表示程序运行时候改变的状态的,是一个抽象的概念。

变量组成:

  [变量名]=[变量实际的值]

  变量名:命名一般字母或下划线开头,剩下的可以是字母和数字,变量名不能和关键字冲突,如ls=1

  变量值:可以改变的值,一个变量名可以重复赋值,但是变量实际的值为最后赋值后的值

变量类型:

  局部变量:只在某一段代码中生效的变量

  全局变量:在整个程序的运行中生效的变量

[root@linux-test ~]# n=1          #当前bash进程中设置局部变量
[root@linux-test ~]# bash          #切换bash到子进程
[root@linux-test ~]# echo $n        #查看变量为空 [root@linux-test ~]# export x=2      #当前bash进程中设置全局变量
[root@linux-test ~]# bash          #切换bash到子进程
[root@linux-test ~]# echo $x        #查看变量
2

Shell命令执行优先级

==> alias        别名
  ==> Compound Commands    复合命令(if、for、while等)
    ==> function               函数
      ==> build_in                内置命令(cd等)
        ==> hash                    hash命令,缓存中用过的命令
          ==> $PATH                    环境变量标明的命令
            ==> error: command not found              找不到命令时候

bash环境

以下四个文件在登录用户的过程中会依次执行

  /etc/profile

  ~/.bash_profile

  ~/.bashrc

  /etc/bashrc

su user不加-登录,只会加载~/.bashrc、/etc/bashrc

全局环境变量配置一般放在/etc/profile文件中,用户级环境变量一般放在~/.bash_profile

临时设置环境变量:

[root@linux-test ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@linux-test ~]# PATH=/usr/local/nginx/sbin/:$PATH
[root@linux-test ~]# echo $PATH
/usr/local/nginx/sbin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

环境变量中查找命令的顺序是依次往后,比如ls命令在当前设置的变量中,首先会从/usr/local/nginx/sbin下找,找不到会从/usr/local/sbin下找,依次找到为止。

永久设置环境变量:

[root@linux-test ~]# echo "export PATH=/usr/local/nginx/sbin:$PATH" >> /etc/profile    #将环境变量的修改写入到开启加载的脚本文件中即可

grep命令详细使用说明

  -v  反转匹配

  -i  忽略大小写匹配

  -r  递归匹配

  -w  单词匹配,属完全匹配,只要有分隔符分割即可

  -n  显示行号

  -q  静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容

  -A  如果匹配成功,则将匹配行及其后n行一起打印出来

  -B  如果匹配成功,则将匹配行及其前n行一起打印出来

  -C  如果匹配成功,则将匹配行及其前后n行一起打印出来

  -c  匹配成功,只打印匹配的行数(一共匹配到多少行的数量)打印出来

  -E  等于egrep,扩展,多用于加入正则表达式后的匹配

  -l  列出文件内容符合指定的范本样式的文件名称,多和-r联用

  -L  列出文件内容不符合指定的范本样式的文件名称,多和-r联用

  -s  不显示错误信息

  -o  只输出文件中匹配到的部分

正则表达式

正则表达式和通配符一样,也是一组特殊符号,通配符是由shell解释执行,正则表达式是由命令解释。

Linux基础系列-Day8的更多相关文章

  1. Linux基础系列-Day2

    基础命令(文件内容管理) 1.cat:在当前终端显示文本文件内容 格式:cat [文件路径] -n 从1开始对所有输出的行数编号 -b 和-n相似,只不过对于空白行不编号:2.head:从文件内容开头 ...

  2. Linux基础系列-Day1

    Linux发展简史 Unix:1969年由美国电话电报公司(AT&T)贝尔实验室的两个工程师所创造的操作系统,它允许计算机同时处理多用户和程序. BSD:重要的Unix分支,1977年由加州大 ...

  3. Linux基础系列—Linux内核源码目录结构

    /** ****************************************************************************** * @author    暴走的小 ...

  4. Linux基础系列—Linux体系结构和Linux内核结构

    /** ****************************************************************************** * @author    暴走的小 ...

  5. Linux基础系列-Day7

    NFS服务(基于CentOS 7.0) NFS(Network File System),网络文件系统,是linux与linux之间进行文件共享的服务,在NFS应用,本地NFS的客户端可以透明地读写位 ...

  6. Linux基础系列-Day6

    Samba服务(基于CentOS 7.0) Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成,Samba主要用于Linux或UNIX和Windows系统之 ...

  7. Linux基础系列-Day5

    网络管理 ifconfig网络管理工具 ifconfig依赖于命令中使用一些选项属性,不仅可以被用来简单地获取网络接口配置信息,还可以修改这些配置,但是通过ifconfig修改的通常为临时配置,即系统 ...

  8. Linux基础系列-Day4

    top系统监控 top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具.通过top命令所提供的互动式界面,用热键可以管理. [root@centos-py ...

  9. Linux基础系列-Day3

    Vim文本编辑器 •Linux设计的重要原则是信息存储在基于文本的文件中.  注:Linux“一切皆文件”是指包含文本文件和用户不可读的二进制文件(如block设备文件) •文本文件:无格式文件,作用 ...

随机推荐

  1. OScached页面缓存的概念和安装

    一.基本概述 OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能.OSCache是个一个广泛采用的高性能的J2EE ...

  2. u3d局域网游戏网络(c# socket select 模型)

    之前写了一篇. 发完之后第二天实际应用到游戏之后还是发现了一些小毛病. 比如网络模块有重复使用(多对象)的情况.所以将静态类该成了普通类. 比如安卓下会有些异常出现导致游戏逻辑不正常.所以网络相关的函 ...

  3. HDU 2639 Bone Collector II (dp)

    题目链接 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in ...

  4. bzoj 3524 可持久化线段树

    我们可以先离散化,然后建立权值的可持久化线段树,记录每个数出现的次数,对于区间询问直接判断左右儿子的cnt是不是大于(r-k+1)/2,然后递归到最后一层要是还是大于就有,否则不存在. 反思:挺简单一 ...

  5. charles https抓包

    1. 配置 Charles 根证书 首先打开 Charles: Charles 启动界面 主界面 然后如下图操作:   之后会弹出钥匙串,如果不弹出,请自行打开钥匙串,如下图: 钥匙串 系统默认是不信 ...

  6. esp8266 IOT Demo 固件刷写记录

    将编译好的固件按照下面地址刷写到esp8266 出现下面错误是因为刷写的设置不对,按照图上设置: load 0x40100000, len 26828, room 16 tail 12chksum 0 ...

  7. java===编译引用第三方文件的类(原创)

    http://blog.csdn.net/m53931422/article/details/42174609 http://blog.csdn.net/u012450329/article/deta ...

  8. Deep Learning基础--线性解码器、卷积、池化

    本文主要是学习下Linear Decoder已经在大图片中经常采用的技术convolution和pooling,分别参考网页http://deeplearning.stanford.edu/wiki/ ...

  9. 【bzoj4896】补退选

    傻逼题. 每个点维护下vector,然后随便做. #include<bits/stdc++.h> ; using namespace std; typedef long long ll; ...

  10. HDU 6109 数据分割 并查集,SET

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6109 题意:中文题面 解法:每次都贪心地尝试将尽量多的条件放进当前这组,遇到第一个与已有条件冲突时,就 ...