Shell And Base
Bash是什么?
bash是shell的一种
是被采用的最多的shell版本。
##Shell 是什么?
shell在翻译来看:
n. 外壳; 炮弹; (贝、卵、坚果等的) 壳; (人的) 表面性格;
那它到底是什么呢?
我们可以理解为shell是Linux内核的“外壳”程序?的确,shell是Linux内核和操作系统的「桥梁」,我们在操作系统的所有任务都可以通过shell来与Linux内核进行交互。shell是一个用C编写而成的程序。
Linux下有许多Shell版本,有Bourne again shell(bash)、C shell(csh)、Korn shell(ksh)、Tenex C shell(tcsh)等等。
虽然有这么多版本,但是shell的功能基本相同,现在许多默认的发行版本用的是默认的bash版本。
shell是一种解释型程序的设计语言
shell有定义了各种变量各种函数以及函数结构等,利用它可以编写出shell脚本程序,有点想windows的dos下的批处理文件。
shell又是一种命令解释程序
我们接下来要经常使用shell是因为它是命令解释程序,shell会解释用户输入的命令,然后提交给Linux内核,最后会把结果返回给用户。
内置命令
shell定义了一些内置命令,比如cd,pwd,exit等等,当用户登录到系统的时候,shell就会和这些内置命令一起加载到内存中,直到用户退出系统才停止运行。
可执行文件
除了内置命令外,Linux上还有可执行文件,这些可执行文件可以作为shell命令来执行,比如存放在/lib/ls 的 ls 就是可执行文件,它和shell内置命令的不同在于:可执行文件的命令只有在被调用的时候哦才会加载到内存中去。
shell命令提示符的用户区别
当用户登录进入系统的时候,如果用的是普通用户,那么shell会以“$”表示,如果是超级用户,那么shell就会以“#”表示!
Shell命令行的格式
command [options] [argument]
其中:
- command : 命令的名字
- options : 选项,它用来改变命令的执行方式,一般前面会加个“-”符号
- argument: 参数,指定操作的对象
例如:
>ls -l /etc
其中ls就是命令的名字, -l 就是指定要这个命令执行的方式,比如这里是列出目录, /etc就是参数,我们这里是对 /etc的目录进行操作。
所以这句命令行的意思就是 : 使用ls命令列出 /etc 下的所有目录。
###shell命令行的用法
命令选项合并使用
比如我们要列出etc目录下的所有文件,包含隐藏文件,那么我们就会这样输入:
ls -a -l /etc
然后选项合并之后可以变成成这样:
>ls -al /etc
###命令参数通配符的使用
shell命令的通配符的存在是为了我们在使用命令参数的时候对文件目录进行描述,比如我要查询以.sh结尾的所有文件,那么这个时候通配符就会让我们很方便的使用了。
常用的通配符有以下几个:
- * 一个或任意多个
- ? 任意单一字符
- [] 包含在[]内的单字符
例如:
列出etc下的 子目录 的所有以 .conf 结尾的文件
ls -al /etc/*/*.conf
列出当前目录下以a开头,随后一个为随意字母的txt文件:
ls a?.txt
列出当前目录下以a开头,随后三个为随意字母的txt文件:
ls a??.txt
列出当前目录下,以a开头,随后含有1,2,3,4的txt文件:
ls a[1,2,3,4].txt //这里也可以写成 ls a[1-4].txt
shell重定向操作
有时候我们在字符窗口输入命令行的时候,可能输入源不只是我们敲入的命令行,也可能来源于某个文件,在结果输出的时候有时候数据太多,我们可能需要将它的输出定向到指定的文件,然后我们去文件里面看输出结果,还有的就是一些错误信息,我们也可以将它重定向输出,而不仅仅是在屏幕输出。
所以有这三个:
- 标准输入 对应的重定向操作符为 “<” , “«”;
- 标准输出 对应的重定向操作符为 “>” , “»”;
- 标准错误输出 对应的重定向操作符为 “2>” , “2»“。
标准输入
wc <</etc/shadow
42 42 1236
wc << b b
> hsdufhi
> wfhieurhf
> eirfuberigvber
> weifuwheifu
> huief ieufh iu erfih
> bb
5 8 67
我们看到第一个命令: wc < /etc/shadow
这个命令的意思就是:wc是统计命令,来源是/etc/shadow,统计的行数,单词数,字符数输出结果。
第二个命令 :
wc << bb
> ...
> ...
> ...
> bb
这里的 « 就是告诉命令输入源来源于 bb 和 bb之间,这个bb就是内容的分隔符,可以使任意字符,然后我们就统计到我们在bb之间的行数,单词数,字符数。
标准输出
比如我们将结果输出放到 ls.txt 就可以这样:
ls /etc >ls.txt
如果这时候ls.txt文件不存在,那么系统会自动创建一个,如果系统已经存在了ls.txt,那么系统会将ls.txt原有的内容覆盖掉。如果不想被覆盖,那么这时候就可以用到 “»”:
ls /etx >>ls.txt
这个时候将输出的内容追加到ls.txt。
标准错误输出
标准错误输出和标准输出差不多,只不过在输出的时候是 :
2> error.txt;
shell管道
管道,顾名思义,就是将第一个命令的输出当做第二个命令的输入,管道的符号为” “,比如:
ls -l /etc |more
将 /etc 下的目录输出,然后用more的进行分屏显示。
shell的转义
shell的命令有一些特殊的字符是有含义的,我们在使用它们的时候要进行转义才可以使用。比如刚才我们已经知道 ? 是一个通配符,代表一个任意字符, 但是如果我们真的有一个文件叫做 abc?呢,我们就不能把?当做通配符来使用,这时候就对它进行转义,让系统知道这是真正文件名。
那么转义字符有: 反斜杠(\) 、双引号(”“)、单引号(’‘)。
比如我要列出abc?这个文件下的所有目录:
ls -l abc/?/*
```
也可以这样写:
ls -l ‘abc?/*
也可以这样写:
ls -l “abc?/*”
当然了对于一些更特殊的字符即使我们使用了转义字符,它也会保留自己,比如 “$” ,”`” ,”"
比如这里我用 “” 对 ` 进行转义是无效的:
echo this is “hostname
“
this is mymacbook.local