发布日期:2017-03-16 14:56:16

本文只是快速了解bash的一些基本概念和命令的学习笔记。

  • 认识bash shell
  • Shell的变量使用
  • 命令别名和历史命令
  • Bash的操作环境
  • 资料流重定向(redirection)
  • 管道命令

认识bash Shell

学习Shell有很多好处,在Linux中就是核心神器。文字界面效率就是快,通过命令用来远程管理以及批处理,工作效率大大提升。然后shell入门确也是一件头疼的事,如果不常使用,过一段时间就会忘了,只剩下几个常用命令。如果不系统的了解一下shell,常常会有迷失,这就是学习成本。

Bash shell只是一种常用的linux shell,而实际上有很多shell版本,之间有些故事。

Shell的版本有1. Bourne SHell(简称sh) 2. Sun里面的C SHell(简称csh), 3. 商业上常用的KSHell, 4. TCSH等等,每个都有特点。 Linux系统下常用的为Bourne Again SHell(简称bash),它是sh的增强版。

这么多shell,怎么看系统中提供了哪些shell呢?

这个问题可以查看文件/etc/shells。这里列出了系统可用的shell

/bin/sh (已被 /bin/bash 所取代)
/bin/bash (就是 Linux 默认的 shell)
/bin/tcsh ( C Shell ,提供更多的功能)
/bin/csh (已被 /bin/tcsh 所取代)

我的mac下可以看到:

为什么系统中会有这么多shell? 因为系统一些任务在运行时会去检查user能够使用哪些shell. 而用户进入系统默认使用的哪个shell取决于/etc/passwd中对应用户的默认shell项。

etc/passwd

Bash Shell有很多强大的功能:

1)history功能(记录使用过的历史命令) 这些历史命令都记录在/[home]/.bash_history 如/Users/xxx/.bash_history

2)tab补全命令功能。 bash shell下多按几次tab是个不错的习惯。tab接在命令的第一个字和第二字后效果不一样。后者为文件名补全。

3)alias命令别名设置。 比如 alias lm='ls -al' 这样以后就可以直接使用lm来代替ls -al了。

4)job control, foreground, background。 工作控制,前景背景控制。

5)shell scripts程序化脚本

6)wildcard的支持。例如 ls -l /usr/bin/X* 就可以知道/usr/bin底下有多少以X开头的文档

7) 通过type命令来查看命令是bash内部指令还是外部指令。所以在一定程度上可以替代which命令了。

8)\[Enter] 来换行,注意反斜杠\后面紧跟[Enter]回车键,这样可以书写更直观的长命令了

9)通过组合件来实现更正命令。Mac下注意是ctrl键,而不是苹果键。

Shell的变量使用

  • 变量的赋值和定义 Shell中变量不需要先申明。可以直接使用=来赋值。如 myVariable="This is my myVariable Value"。注意等号两边不能有空白字符。变量名只能是英文字符和数字,数字不能开头。如果变量值中包含空白字符,则需要使用双引号"或者单引号'将内容包含起来,没有空白字符时可以不用引号。但是双引号和单引号还是有区别的。双引号中包含的特殊字符如$可以保持原有的特性。即$表示变量取值。而单引号中的特性字符仅仅表示一般的字符,纯文本字符。如var="lang is $LANG"则echo $var结果为lang is zh_TW.UTF-8。 而var='lang is $LANG'其echo $var结果就是lang is $LANG。
  • 关于变量值,也可以用反斜杠\来escape那些特殊字符(比如空白字符,美元字符,回车字符). var=firstName\ LastName
  • 变量的取值。如果要获取变量的值,只需要在变量名前加上$符号。 $myVariable。 也可以通过${变量名}来获取。${myVariable}
  • 在一串指令执行时,如果还需要通过其他额外的指令提供的输出结果时,可以通过反单引号`指令`或者$(指令)来执行子命令。反单引号也被称为backticks.
  • 如果对变量扩增变量内容时,使用"$变量名" 或者${变量名}来实现。如PATH="$PATH":/home/bin或者PATH=${PATH}:/home/bin。注意是双引号。
  • 如果需要将该变量引入到子程序中执行,则需要export来将给变量导入到运行环境中,即环境变量。export PATH
  • 如果要释放该变量,则unset 变量名。

借用鸟哥的例子来加深一下印象。

  • 环境变量和自定义变量。
    • 通过env和export命令来显示当前所有的环境变量
    • 通过set来显示所有的变量,包含环境变量和用户自定义变量
    • 几个特殊的变量: 变量$表示本shell的PID: $$。 变量?表示上次执行命令的返回值$?
    • 影响显示结果的语义环境变量, locale指令可以查看本地环境信息
  • 变量的值通过键盘读取方法:read指令  read [-pt] variable p表示提示字符 t表示等待的秒数。 read -p "Please input your name: " -t 80 name。 这样就会讲输入值赋值给name变量。
  • 对变量类型的申明使用declare或typeset指令来实现。
    • decare [-aixr] variable
    • -a 表示将后面的变量定义为array数组
    • -i 表示将变量定义为整数,如果有表达式,则帮助计算值
    • -x 表示将变量定义成环境变量,效果如同export
    • -r 表示将变量定义为只读类型
    • 将-变成+可以进行取消动作 declare +x variable
    • 如果declare后面什么都不加,效果就如同set
  • 变量数组 可以直接通过var[index]=value的方式来设置。读取的时候通过${var[index]}的方法
  • 变量内容的删除${variable#str}   ${variable##str}  ${variable%str}  ${variable%%str} 和替换${variable/oldStr/newStr}以及测试${variable-defaultValue}
    • 强大的功能来了,变量除了可以直接修改原来的值之外还可以不修改值的情况下来替换值。继续来一个鸟哥的例子。#表示从开始向后删除的最短的那个,##表示从开始向后删除最长的那个,%表示向前删除的最短的那个,%%表示从最后向前删除最长的那个。
    • 看完了这些强大的功能,头会看晕的,因为不同于我们一般的程序语言。过于强大了,以至于估计不会记得使用。

参考资料:

  • 学linux离不开鸟哥: http://linux.vbird.org/linux_basic/0320bash.php

 

发表评论