Linux基础篇 六 (bash shell基础 (vi /etc/shells))

http://hi.baidu.com/shmily_soc/blog/item/5173a587fed9733666096ef6.html

管理整个硬件的其实是核心 (kernel),那我们一般使用者 (user) 则是以 shell 来跟核心沟通,让核心达到我们所想要达到的工作目的!shell可以是文字接口模式的,也可以是 KDE 之类的图形接口控制软件。

1. 变量的取用与设定:echo, 变量设定规则, unset (变量与环境变量有区别,前者只能在本shell内用,后者才可以在其它子程序(shell)共用)
[root@linux ~]# echo   $变量名 ---->变量定义或查看
[root@linux ~]# PATH=$PATH:/home/dmtsai/bin   ---->变量累加
[root@linux ~]# export PATH     ---->若该变量需要在其它子程序执行,则需要以 export 来使变量变成环境变量
[root@linux ~]# unset 变量名
[root@linux ~]# cd /lib/modules/`uname -r`/kernel   ---->进入到目前核心的模块目录!!!

   >>在变量的设定当中,单引号与双引号的用途有何不同? --->双引号仍然可以保有变量$name的内容. 而使用了单引号的时候,$name 将失去原有的变量内容,仅为一般字符的显示型态而已!!!
   >>在指令下达的过程中,quote ( ` ) 这个符号代表的意义为何?--->在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输入信息, 如上面的 `uname -r`, 显示时就是kernel的版本号!!!
   >>设定比较长的目录名称成为一个四个字符的变量,如此一来只要输入『 cd $VARI 』这个指令,马上就移动到该路径下!

2. 环境变量的说明: env
[root@linux ~]# env 或 export ----->列出目前的 shell 环境下的所有环境变量与其内容。
[root@linux ~]# set ----->列出所有定义的变量,包括自己定义的.

> $ : 表示本shell的PID , 所以:
[root@linux ~]# echo $$ ----->获得当前所用shell的PID号.

>自订变量转成环境变量: export   
[root@linux ~]# export 变量名 ----->注意变量名前无符合$. 两者区别是前者不可被子程序引用,而后者可以. 因为自行设定的变量,只在目前这个shell环境当中存在,在子程序中将不会存在此一变量。除非使用 export 将自订变量变成环境变量。

3. 变量键盘读取、数组与宣告: read, array, declare
[root@linux ~]# read [-pt] variable ----->由键盘输入一个值给变量variable赋值
[root@linux ~]# declare [-aixr] variable
   -a :将后面的 variable 定义成为数组 (array)
   -i :将后面接的 variable 定义成为整数数字 (integer)
   -x :用法与 export 一样,就是将后面的 variable 变成环境变量;
   -r :将一个 variable 的变量设定成为 readonly ,该变量不可被更改内容,也不能 unset
[root@linux ~]# array var[index]=content

4. 命令别名的设定与取消: alias, unalias
[root@linux ~]# alias lm='ls -l | more'
[root@linux ~]# unalias lm

5. 历史命令:history
[root@linux ~]# history [n]
[root@linux ~]# history [-c]
[root@linux ~]# history [-raw] histfiles
   n :数字,意思是『要列出最近的 n 笔命令列表』的意思!
-c :将目前的 shell 中的所有 history 内容全部消除!
-a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles,则预设写入~/.bash_history
-r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中!
-w :将目前的 history 记忆内容写入 histfiles 中!
[root@linux ~]# !number
[root@linux ~]# !command
[root@linux ~]# !!
         ------>history配合!指令的用法很有用!!
number :执行第几笔指令的意思;
command :由最近的指令向前搜寻『指令串开头为 command』的那个指令,并执行;
!!      :就是执行上一个指令(相当于按↑按键后,按 Enter)

6. 环境设定档: bashrc, ~/.bashrc, ~/.profile, profile...,/etc/inputrc, source
   要注意的是,在指令列输入的变量也好、命令别名也罢, 都是针对该次登入的设定而已,所以只要您一注销,那么上次的设定值就会不见了!因此,我们需要有几个档案来帮助我们,每次登入的时候,就已经帮我们搞定了环境的设定!具体哪个档案定义了哪些内容,可以用vi查看。

>个人设定值
   在个人根目录的几个隐藏文件:~/.bash_profile, ~/.bash_login, ~/.profile中可以设置个人化的路径 (PATH) 与环境变量等等,bash 启动时,会先去读取 ~/.bash_profile,找不到时,就去读取 ~/.bash_login ,然后才是 ~/.profile。在~/.bashrc中也可以做各人化的设定,比如命令别名、路径等等。这样就可能会出现同一个量在多个档案中设定的情况,那以哪个为准呢?总的来说是输入的设定值取代先输入的设定值,具体读取顺序如下:
   a. 先读取 /etc/profile ,再根据 /etc/profile 的内容去读取其它额外的设定档, 例如 /etc/profile.d 与 /etc/inputrc 等等设定档;
   b. 根据不同的使用者,到使用者家目录去读取 ~/.bash_profile 或 ~/.bash_login 或 ~/.profile 等设定档;
   c. 根据不同使用者,到他家目录去读取 ~/.bashrc 。 ---->可见登入bash后,~/.bashrc里面的设定会是最终的设定值!这样,不论原来系统帮我们做了什么设定值,都可以在这里设定属于自己熟悉的环境!!!

======>所有设定完毕后,logout----->login才能生效!!! 也可以通过如下指令来使设定立即生效:
[root@linux ~]# source ~/.bashrc   或
[root@linux ~]# . ~/.bashrc

>login shell 与 non-login shell
   当登入 Linux ,亦即是取得 login shell 时,会读取 ~/.bash_profile, ~/.bash_login, ~/.profile,这三个档案的优先级已经在上面提过。至于在取得 login shell 后继续动作的其它 non-login shell,读取的就是仅有 ~/.bashrc 。而大部分的 linux distributions 都会将~/.bash_profile 的内容指到 ~/.bashrc 去,这样比较简单了!

>终端机的环境设定: stty, set
[root@linux ~]# stty [-a]
   -a :将目前所有的 stty 参数列出来
[root@linux ~]# stty erase ^h ---->重设终端机快捷命令 (^ 表示 Ctrl+) 一般bash已经帮我们设好了,这里要知道是怎么设的!

>万用字符/特殊符号/组合键
*    : 万用字符,代表 0 个或多个字符(或数字)
?   : 万用字符,代表『一定有』一个字母
` ` : 两个『 ` 』中间为可以先执行的指令
[ ] : 在中间为字符的组合, 如: [root@linux ~]# cp test[1-5] /tmp, "[]"仅代表一个字符,而这个字符的定义可以是范围(-).
Ctrl + S : 暂停屏幕的输出
Ctrl + Q : 恢复屏幕的输出
Ctrl + U : 在提示字符下,将整列命令删除
Ctrl + Z : 『暂停』目前的命令           ---->这些组合键都可以通过stty设定

>数据流重导向 (--->至文件或打印机等设备)
   a. 标准输入(stdin) :代码为 0 ,使用 < 或 << ;
   b. 标准输出(stdout):代码为 1 ,使用 > 或 >> ; ---->单 > 会新建或覆盖原来文件内容, >>会新建或累加进原来文件.
   c. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

[root@linux ~]# find /home -name testing > list_right 2> list_error(或/dev/null 丢掉)---->正确与错误结果同时输出到不同文档!
[root@linux ~]# find /home -name testing > list 2>&1 ---->正确与错误结果同时输出到同一个文档!
[root@linux ~]# cat > catfile                         ---->由键盘输入数据到档案,Ctrl+d结束输入
[root@linux ~]# cat >> catfile < somefile             ---->将原本需要由键盘输入的数据,经由档案来读入
[root@linux ~]# cat > catfile << eof                  ---->"<<"代表结束输入字符

>命令执行的判断依据: ; , &&, ||
[root@linux ~]# sync; sync; shutdown -h now     ----->指令与指令中间利用分号 (;) 来隔开,分号前的指令执行完后,就会立刻接着执行后面的指令
[root@linux ~]# ls /tmp && touch /tmp/testingagin---->当前面的指令执行结果为正确,就可以接着执行后续的指令, 否则就予以略过
[root@linux ~]# ls /tmp/vbirding || touch /tmp/vbirding----->当前一个指令有错误时,在 || 后面的指令才会被执行

>管线命令 (pipe)
   每个管线的前后部分都是『指令』!而后一个指令的输入乃是由前一个指令的输出而来的. 如:
[root@linux ~]# ls -al /etc | less

>>撷取命令: cut, grep
   cut: 将一段讯息的某一段给他『切』出来, 处理的讯息是以『行』为单位, 即针对每一行做"cut"!
[root@linux ~]# cut -d'分隔字符' -f fields

[root@linux ~]# echo $PATH | cut -d ':' -f 3,5(取第3,5段)
   -d :后面接分隔字符。与 -f 一起使用;
   -f :依据 -d 的分隔字符将一段讯息分割成为数段,用 -f 取出第几段的意思;
   -c :以字符 (characters) 的单位取出固定字符区间;

   grep: 是分析一行讯息,若当中有我们所需要的信息,就将该行拿出来~
[root@linux ~]# grep [-acinv] '搜寻字符串' filename ----> [root@linux ~]# last | grep 'root'
[root@linux ~]# grep shmily_liu /etc/passwd /etc/shadow /etc/group
   -a :将 binary 档案以 text 档案的方式搜寻数据
   -c :计算找到 '搜寻字符串' 的次数
   -i :忽略大小写的不同,所以大小写视为相同
   -n :顺便输出行号
   -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!

>>排序命令: sort, wc, uniq
[root@linux ~]# cat /etc/passwd | sort                ---->将帐号进行排序
[root@linux ~]# cat /etc/passwd | sort -t ':' -k 3 ---->/etc/passwd 内容是以 : 来分隔的,以第三栏来排序
[root@linux ~]# uniq [-ic]                          ---->排序完成了,将重复的资料仅列出一个显示
    -i :忽略大小写字符的不同;
   -c :进行计数
[root@linux ~]# wc [-lwm]    ----> [root@linux ~]# cat /etc/man.config | wc
   -l :仅列出行;                ----> 查询档案里面有多少字?多少行?多少字符?
   -w :仅列出多少字(英文单字);
   -m :多少字符;

>>字符转换命令: tr, col, join, paste, expand
      实现大写改成小写,或者是 [tab] 按键转成空格键,或将两篇讯息整合成一篇等等文档操作功能! 用的比较少,需要时再来看。

>>分割命令: split ----->将一个大档案,依据档案大小或行数来分割,就可以将大档案分割成为小档案
[root@linux ~]# split [-bl] file PREFIX
[root@linux ~]# cd /tmp; split -b 300k /etc/termcap termcap
   -b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等;
   -l :以行数来进行分割。
   PREFIX: 大档案分割成小档案后的名字前缀,便于识别。

>> foo1 && foo2 | foo3 > foo4 ,这个指令串当中, foo1/foo2/foo3/foo4 是指令还是档案? 整串指令的意义为?
   ====>foo1/foo2 与 foo3 都是指令, foo4 是装置或档案。整串指令意义为:
      a. 当 foo1 执行结果有错误时,则该指令串结束;
      b. 若 foo1 执行结果没有错误时,则执行 foo2 | foo3 > foo4 ;
      c. foo2 将 stdout 输出的结果传给 foo3 处理;
      d. foo3 将来自 foo2 的 stdout 当成 stdin ,处理完后将数据流重新导向 foo4 这个装置/档案

原文地址:https://www.cnblogs.com/leaven/p/1733572.html