(八)Bash(一)

 1.什么是shell?

广义shell就是用户与操作系统kernel交互的工具

狭义shell当然就是要学习的bash shell,或者csh等

2.系统的合法 shell 与 /etc/shells 功能

shell版本众多,/etc/shells这个文件中记录了合法的shell,系统会去这个文件中检查使用者能够是用的shell版本

用户登陆时取得的shell由/etc/passwd这个文件规定

3.bash shell

基本功能:

  • 命令记忆能力 (history):~/.bash_history
  • 命令与文件补全功能:tap
  • 命令别名设定功能:alias
  • 工作控制、前台后台控制: (job control, foreground, background)
  • 程式化脚本: (shell scripts)
  • 通配符

内建命令 type:

这个命令可以查看命令的种类,内建(builtin),别名(alias),或者外部指令

 

4.shell变量

1.首先,必须了解bash环境变量(PATH,MAIL,USER等)

env命令可以查看当前shell的环境变量,

set:bash 可不只有环境变量喔,还有一些与 bash 操作介面有关的变量(如HISTFILE,PS1,PS2,$当前shell的PID , ?刚执行完指令的返回值等),以及使用者自己定义的变量存在的。set可以查看所有这些变量

export也可以查看环境变量,而且,在父shell或子shell中声明的变量都只能自己使用,若要使父shell的变量为子shell所用,则要将变量export为环境变量。(不过子shell的变量能不能给父shell用呢?)

 

2. 变量的申明和使用

bash中的变量是弱变量类型,在没有特别说明的情况下,都以string存储。
变量不能以数字开头。
变量最好这样使用:${变量名}
申明变量时单引号和双引号的区别:双引号可以进行变量替换,而单引号则是所见即所得 在一串命令中,还需要由其他的命令提供的信息,可以 使用反单引号`命令`或 $(命令)取得,推荐使用$(命令),在定义变量时也适用。
取消变量的方法为使用 unset
 

 

 3.影响显示结果的语系变量(locale)

 locale -a 可以查看系统支持的所有语系

 locale则列出当前的语系,如:


  
  
  
  
  1. LANG=en_US.UTF-8 
  2. LC_CTYPE="en_US.UTF-8" 
  3. LC_NUMERIC="en_US.UTF-8" 
  4. LC_TIME="en_US.UTF-8" 
  5. LC_COLLATE="en_US.UTF-8" 
  6. LC_MONETARY="en_US.UTF-8" 
  7. LC_MESSAGES="en_US.UTF-8" 
  8. LC_PAPER="en_US.UTF-8" 
  9. LC_NAME="en_US.UTF-8" 
  10. LC_ADDRESS="en_US.UTF-8" 
  11. LC_TELEPHONE="en_US.UTF-8" 
  12. LC_MEASUREMENT="en_US.UTF-8" 
  13. LC_IDENTIFICATION="en_US.UTF-8" 
  14. LC_ALL

有很多,但是一般只需要定义LANG,后面的选项自动设置

注意:/etc/sysconfig/i18n中定义了系统预设语系

 

4.变量键盘读取、数组与宣告: read, array, declare

  
  
  
  
  1. read [-pt] variable 
  2.  
  3. 选项与参数: 
  4.  
  5. -p  :后面可以接提示字元! 
  6.  
  7. -t  :后面可以接等待的秒数 

 

 array:

4.0以下的bash不支持关系型数组,仅支持一维数组,索引从0开始
数组的引用方式:${数组[索引]},如echo ${A[1]},索引也可以做算术运算,${A[1+1]}, 等同于${A[2]}
建立数组方式:B=(1 2 3 4)
${B[@]}和${B[*]}都能取出所有的数组元素,前者得到4个以空白间隔的数字,后者得到一整个字符串。
${#B[@]}和${#B[*]}都能得到数组长度,若数组中某一元素是string,${#B[index]}可以得到元素长度。
 
  
  
  
  
  1. declare [-aixr] variable 
  2.  
  3. 选项与参数: 
  4.  
  5. -a  :将后面名为 variable 的变数定义成为阵列 (array) 类型 
  6.  
  7. -i  :将后面名为 variable 的变数定义成为整数数字 (integer) 类型 
  8.  
  9. -x  :用法与 export 一样,就是将后面的 variable 变成环境变数; 
  10.  
  11. -r  :将变数设定成为 readonly 类型,该变数不可被更改内容,也不能 unset 

用+取代-,可以将相应的特征除去

 

 前面提到,变量默认是字符串,在此可以将变量定义为数组或者整数,但似乎不能处理小数?(bash 环境中的数值运算,预设最多仅能到达整数形态,所以 1/3 结果是 0;)

5.与档案系统及程序的限制关系: ulimit

  
  
  
  
  1. ulimit [-SHacdfltu] [配额] 
  2. 选项与参数: 
  3. -H  :hard limit ,严格的设定,必定不能超过这个设定的数值; 
  4. -S  :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息。 
  5.       在设定上,通常 soft 会比 hard 小,举例来说,soft 可设定为 80 而 hard  
  6.       设定为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时, 
  7.       系统会有警告讯息通知你! 
  8. -a  :后面不接任何选项与参数,可列出所有的限制额度; 
  9. -c  :当某些程式发生错误时,系统可能会将该程式在记忆体中的资讯写成档案(除错用), 
  10.       这种档案就被称为核心档案(core file)。此为限制每个核心档案的最大容量。 
  11. -f  :此 shell 可以建立的最大档案容量(一般可能设定为 2GB)单位为 Kbytes 
  12. -d  :程序可使用的最大断裂记忆体(segment)容量; 
  13. -l  :可用于锁定 (lock) 的记忆体量 
  14. -t  :可使用的最大 CPU 时间 (单位为秒) 
  15. -u  :单一使用者可以使用的最大程序(process)数量。 

 

6.$扩展

 在Bash Shell中,$算符会触发下述3种扩展:

  • 变量扩展, ${filename}
  • 命令扩展,${ls /}
  • 算法扩展,$((9+9))
1.变量扩展(一)
变量扩展是一种隐含的“if-then-else”语法,变量的三种情况,空值,不存在,非空值。
  • r=${var:-str},若var为空或者不存在,则r=str,否则r=var
  • r=${var:=str},若var为空或者不存在,则r=var=str,否则r=var
  • r=${var:?str},若var为空或者不存在,则直接显示str,一般用于警告信息
  • r=${var:+str},若var存在且非空,则r=str,否则r为空值
“ : ”的作用就是测空值。注意str是一个值,而不是一个变量
2.变量扩展(二)
  • 取字符串切片:${变量:位置起点},由指定的位置开始,截取子字符串到结束。${变量:位置起点:长度}。注意index从0开始。
  • 取部分位置参数:${@:起点},${@:起点:个数},index是0时是函数或者程序本身。
  • 字符串长度:${#变量名称}

 3.变量扩展(三)

  • 完整变量 vbird="/home/vbird/test/test.sh"
     echo ${vbird##/*/}  ----tesg.sh  去掉最长的//间字符(从前)
     echo ${vbird#/*/}  -----vbird/test/test.sh 去掉最短的//间字符(从前)
     echo ${vbird%%/*}----删完,去掉最长的以/开头的字符(从后)
     echo ${vbird%/*}----/home/vbird/test,去掉最短的以/开头的字符(从后)
  • 替换和删除
      $(变量/样式/替换字符串),替换第一个。$(变量//样式/替换字符串),替换全部。当替换字符不存在,则为删除。
4.命令替换
格式:var=$(命令),这是新式的写法,旧式:var=`命令`,建议使用新式写法。
5.算数扩展
I=8+8
echo $I
上述代码结果为8+8,因为I默认是string格式的。
如果想要进行数子运算,bash中有很多方法,算术扩展是其中之一:
I=$((8+8))
 

7.命令别名与历史命令

alias只是一种简化写法,不要期望它能做更智能的事

alias lm="ls -l | more",如果这样使用lm:lm file,是不能按照你的意愿执行的

 

历史:

     
     
     
     
  1. history [n]  
  2. history [-c]  
  3. history [-raw] histfiles  
  4. 选项与参数:  
  5. n   :数字,意思是‘要列出最近的 n 笔命令列表’的意思!  
  6. -c  :将目前的 shell 中的所有 history 内容全部消除  
  7. -a  :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,  
  8.       则预设写入 ~/.bash_history  
  9. -r  :将 histfiles 的内容读到目前这个 shell 的 history 记忆中;  
  10. -w  :将目前的 history 记忆内容写入 histfiles 中!  
  11. !number 
  12. !command 
  13. !! 
  14. 选项与参数: 
  15. number  :执行第几笔指令的意思; 
  16. command :由最近的指令向前搜寻‘指令串开头为 command’的那个指令,并执行; 
  17. !!      :就是执行上一个指令(相当于按↑按键后,按 Enter) 

 注意:默认情况下~/.bash_history文件记录的是本次登录前的命令记录,本次登录使用的历史记录需要登出后才会写入这个文件。

在同一账号有多个终端登录的情况下,非最后登出的本次历史记录将被覆盖

8.Bash Shell 的操作环境

执行命令的先后顺序:

 

  1. 以相对/绝对路径执行指令,例如‘ /bin/ls ’或‘ ./ls ’;
  2. 由 alias 找到该指令来执行;
  3. 由 bash 内建的 (builtin) 指令来执行;
  4. 透过 $PATH 这个变数的顺序搜寻到的第一个指令来执行。

 

login 与 non-login shell:

 

  • login shell:取得 bash 时需要完整的登入流程的,就称为 login shell。举例来说,你要由 tty1 ~ tty6 登入,需要输入使用者的帐号与密码,此时取得的 bash 就称为‘ login shell ’��;
     
  • non-login shell:取得 bash 介面的方法不需要重复登入的举动,举例来说,(1)你以 X window 登入 Linux 后, 再以 X 的图形化介面启动终端机,此时那个终端介面并没有需要再次的输入帐号与密码,那个 bash 的环境就称为 non-login shell了。(2)你在原本的 bash 环境下再次下达 bash 这个指令,同样的也没有输入帐号密码, 那第二个 bash (子程序) 也是 non-login shell 。

 

这两个取得 bash 的情况中,读取的文件资料并不一样。

 

一般来说,login shell 其实只会读取这两个文件:

  1. /etc/profile:这是系统整体的设定,你最好不要修改这个文件;
  2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:属于使用者个人设定,你要改自己的资料,就写入这里!(这3个文件按顺序只会读取一个)

 

 

注意:一般情况下,修改了配置文件后,不能立即生效,要在下次登录时才能生效。利用source或者(.)命令可以使配置文件立即生效。在有多个配置文件切换使用比较有用

non-login shell只读取~/.bashrc这一个配置文件

其他几个配置文件:

/etc/man.config(man相关),~/.bash_history,~/.bash_logout(登出处理)

 

9.终端机的环境设定: stty, set

预设情况下已经很好了,不需要动,知道有这两个命令就可以了,用到再说吧

bash预设的组合键:

  
  
  
  
  1. 组合按键    执行结果 
  2. Ctrl + C    终止目前的命令 
  3. Ctrl + D    输入结束 (EOF),例如邮件结束的时候; 
  4. Ctrl + M    就是 Enter 啦! 
  5. Ctrl + S    暂停萤幕的输出 
  6. Ctrl + Q    恢复萤幕的输出 
  7. Ctrl + U    在提示字元下,将整列命令删除 
  8. Ctrl + Z    ‘暂停’目前的命令 

 

10.通配符和特殊符号

通配符:

  
  
  
  
  1. *   代表‘ 0 个到无穷多个’任意字元 
  2. ?   代表‘一定有一个’任意字元 
  3. [ ] 同样代表‘一定有一个在括号内’的字元(非任意字元)。例如 [abcd] 代表‘一定有一个字元,
  4.  可能是 a, b, c, d 这四个任何一个’ 
  5. [ - ] 若有减号在中括号内时,代表‘在编码顺序内的所有字元’。例如 [0-9] 代表 0 到 9
  6.  之间的所有数字,因为数字的语系编码是连续的! 
  7. [^ ]  若中括号内的第一个字元为指数符号 (^) ,那表示‘反向选择’,例如 [^abc] 代表 
  8. 一定有一个字元,只要是非 a, b, c 的其他字元就接受的意思。 

特殊符号:

  
  
  
  
  1. #   注解符号:这个最常被使用在 script 当中,视为说明!在后的资料均不执行 
  2. \   转义符号:将‘特殊字元或万用字元’还原成一般字元 
  3. |   管线 (pipe):分隔两个管线命令的界定(后两节介绍); 
  4. ;   连续指令下达分隔符号:连续性命令的界定 (注意!与管线命令并不相同) 
  5. ~   使用者的家目录 
  6. $   取用变数前置字元:亦即是变数之前需要加的变数取代值 
  7. &   工作控制 (job control):将指令变成背景下工作 
  8. !   逻辑运算意义上的‘非’ not 的意思! 
  9. /   目录符号:路径分隔的符号 
  10. >>>   资料流重导向:输出导向,分别是‘取代’与‘累加’ 
  11. <<<   资料流重导向:输入导向 (这两个留待下节介绍) 
  12. ' ' 单引号,不具有变数置换的功能 
  13. " " 具有变数置换的功能! 
  14. ` ` 两个‘ ` ’中间为可以先执行的指令,亦可使用 $( ) 
  15. ( ) 在中间为子 shell 的起始与结束 
  16. { } 在中间为命令区块的组合! 

 

你可能感兴趣的:(职场,bash,休闲)