为什么学习shell:不同固定distribution中的shell都是一样的;远程管理中,命令行界面比较快;管理系统很方便
我们常用的一类shell为Bourne Again SHell (bash).
支持的shell记录在/etc/shells文件中
登陆取得的shell记录在/etc/passwd文件中,不同的用户所取得的shell是不一样的。root一般为bash。
history命令,可以查询曾经执行过的命令
~/.bash_history中记录了前一次登陆以前所执行过的命令,至于这一次登陆所执行的命令都被暂存在临时内存中,当你成功注销系统后,该命令才会记录到.bash_history中。但无法记录时间
[tab]接在一串命令的第一个字后面,则为命令补全;
[tab]接在一串命令的第二个字后面,则为文件不全;
命名别名设置功能(
alias):在命令行中输入alias,既可以知道当前的命名别名有哪些,也可以直接执行命令来设置命名别名,例如alias lm='ls -al'
取消命令别名:
unalias lm
通配符:例如ls -l /usr/bin/X* 该目录下查找以X开头的文件
如果命令行太长,可以利用反斜杠\来进行换行,其实是一个转义[\enter],中间没有空格。
echo,变量的显示,需在变量前加上$符号,echo $variable,如echo $PATH或echo ${PATH}也可以
设置变量的内容:变量名=内容 即可
等号两边若有空格,需要用双引号或单引号括起来,双引号保留了原本的特性,单引号里面为一般字符(纯文本)
变量名开头不能为数字
为变量增加内容:如PATH="$PATH":/home/bin
若该变量需要在其他子进程执行,则需要以
export来使变量称为环境变量; export PATH
通常大写字符为系统默认变量,自行设置变量可以使用小写字符
取消变量:unset 变量名称,如unset myname
#bash进入子进程。这里的子进程是在目前这个shell的情况下,去打开另一个新的shell,新的shell就是子进程。一般的状态下,父进程的自定义变量是无法再子进程内使用的,但通过export将变量编程环境变量后,就能够在子进程下使用了。
反单引号(`)之内的命令将会被先执行,而其执行出来的结果将作为外部的输入信息。
env 查看环境变量。它是environment的缩写
- HOME 用户的主文件夹cd ~
- SHELL 使用的shell是哪个程序,默认/bin/bash
- HISTSIZE 记录历史命令的条数设置
- MAIL 在收信时系统会去读取邮箱文件
- PATH 执行文件查找的路径,目录顺序也很重要
- LANG 语系数据。一般中文编码为zh_CN.UTF-8
- RANDOM "随机数"的变量。随机数生成器即/dev/random文件,可以挺过这个随机数文件相关的变量($RANDOM)来随机取得随机数值。BASH下,它的范围是0~32767。如果要去0~9之间的数值,利用declare:declare -i number=$RAMDOM*10/32768 ; echo $number
set 查看所有变量(包括环境变量与自定义变量)
$ 本身也是个变量,表示本shell的PID,echo $$。
? 也是一个特殊的变量,它是上一个执行的命令所回传的值。上一个命令成功执行,回传为0,则echo $?会显示0.否则显示相应的错误代码
当你登陆linux并取得一个bash之后,这个bash就是一个独立的进程。接下来你在这个bash下面所执行的任何命令都是由这个bash所衍生出来的,那些被执行的命令就被称为子进程。
环境变量与自定义变量的区别在于是否会被子进程所继续使用。
子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量。
“
export 变量名称” 设置环境变量
若没有接变量名称,则会把所有的环境变量显示出来
locale -a 显示linux支持的语系
locale 不加参数,显示当前的语系信息
语系文件放置在/usr/lib/locale/这个目录中。整体系统默认的语系定义在/etc/sysconfig/i18n文件中
变量键盘读取、数组与声明:read, array, declare
read [-pt] variable,由键盘读取变量的内容
-p:后面接提示符
-t:后面接等待的秒数,不会一直等待用户
ulimit命令:可以限制用户的某些系统资源,包括打开的文件数量、可以使用的CPU时间、可以使用的内存总量等。
变量内容的删除、替代与转换,暂时略过
路径或命令查找顺序:先alias,再builtin(bash内置的),再由$PATH找到路径
bash的登录与欢迎信息:/etc/issue, /etc/motd
bash环境配置文件,终端机的环境设置stty,set,暂时略过
通配符
* 代表0个到无穷多个任意字符
? 代表一定有一个任意字符
还有[], [-], [^]三个
特殊符号
# 批注符号,常用在script中,相当于注释
\ 转义符号
| 管道pipe,分割两个管道命令的界定
; 连续命令执行分隔符
~ 用户的主文件夹
$ 使用变量前导符,即变量之前需要加的变量替代值
& 作业控制job control,将命令变成背景下工作
>, >> 数据流重定向,输出导向,分别是替换与累加
<, << 数据流重定向,输入导向
‘’ 单引号,不具有变量置换功能
“” 双引号,具有变量置换功能
`` 两个`中间为可以先执行的命令,也可以使用$()
() 在中间位子shell的起始于结束
{} 在中间为命令块的组合
数据流重定向
- 标准输入stdin,代码为0,使用<或<< , <<代表结束输入的意思,当输入为<<后面的内容时,就是结束了输入
- 标准输出stdout,代码为1,使用>或>>,>>为累加,>会覆盖原先的内容
- 标准错误输出stderr,代码为2,使用2>或2>>
/dev/null垃圾桶黑洞设备,它可以吃掉任何导向这个设备的信息
将命令的数据全部写入名为list的文件中:
错误:find /home -name .bashrc > list 2>list 不同文件的时候这样用,相同文件下,两条数据可能会交叉写入该文件内,造成次序混乱
正确:find /home -name .bashrc > list 2>&1
正确;find /home -name .bashrc &> list
$?命令回转码
cmd1 && cmd2 若cmd1执行完毕且正确执行($?=0),则开始执行cmd2
若cmd1执行完毕且为错误($?≠0),则cmd2不执行
cmd1 || cmd2 若cmd1执行完毕且正确执行($?=0),则cmd2不执行
若cmd1执行完毕且为错误($?≠0),则开始执行cmd2
判断式:command1 && command2 || command3,一般这样放置,且从左至右来判断,command2和command3会防止肯定可以执行成功的命令
管道命令
界定符号:“|”。
管道命令仅能处理经由前面一个命令传来的正确信息,也就是standard output的信息,对于standard error并没有直接处理的能力。
在每一个管道后面接的第一个数据必定是“命令”。而这个命令必须要能够接受standard input的数据才行。
选取命令
cut, grep
cut是在一行信息中取出某部分我们想要的,grep是分析一行的信息,若当中有我们所需要的信息,就将该行拿出来。
grep [-acinv] [--color=auto] '查找字符串' filename
-a 将binary文件以test文件的方式查找数据
-c 计算找到'查找字符串'的次数
-i 忽略大小写的不同
-n 顺便输出行号
-v 反向选择,即显示出没有'查找字符串'内容的那一行
--color=auto 可以将找到的关键字部分加上颜色显示
排序命令:sort, wc, uniq
双向重定向:tee
字符转换命令:tr, col, join, paste, expand
参数代换:xargs
减号 - 的用途