1、检查 /etc/shells 这个文件可以得到有多少可用的shell,一般有一下几个:
- /bin/sh (已经被 /bin/bash 所取代)
- /bin/bash (就是 Linux 默认的 shell)
- /bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash)
- /bin/tcsh (整合 C Shell ,提供更多的功能)
- /bin/csh (已经被 /bin/tcsh 所取代)
- /bin/zsh (基于 ksh 发展出来的,功能更强大的 shell)
Linux 默认就是使用 bash 。
为什么我们系统上合法的 shell 要写入 /etc/shells 这个文件?
因为系统某些服务在运行过程中,会去检查使用者能够使用的 shells ,而这些 shell 的查询就是通过 /etc/shells 这个文件。
当登陆的时候,系统就会分配个 shell 来工作。 而这个登陆取得的 shell 记录在 /etc/passwd 这个文件内。
2、~/.bash_history 记录的是前一次登陆以前所运行过的命令, 而至于这一次登陆所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中。
3、
- [Tab] 接在一串命令的第一个字的后面,则为命令补全;
- [Tab] 接在一串命令的第二个字以后时,则为『文件补齐』!
4、命令别名配置功能: (alias)
命令行输入 alias 就可以知道目前的命令别名有哪些。
可以直接下达命令来配置别名:
alias lm='ls -al'
5、除了完整的字符串之外, bash 还支持许多的通配符来帮助用户查询与命令下达。
举例来说,想要知道 /usr/bin 底下有多少以 X 为开头的文件,可以使用:『 ls -l /usr/bin/X* 』
6、怎么知道某个命令是来自于外部命令(指的是其他非 bash 所提供的命令) 或是内建在 bash 当中?
利用 type 这个命令来观察即可, type 也可以用来作为类似which命令的用途:找命令
7、命令太长时可以用 [Enter] 使命令换行继续输入。
8、下达 ls 这个命令时,系统就是透过 PATH 这个变量里面的内容所记录的路径顺序来搜寻命令。如果在搜寻完 PATH 变量内的路径还找不到 ls 这个命令, 会在屏幕上显示『 command not found 』的错误信息。
9、为了区别与自定义变量的不同,环境变量通常以大写字符来表示。
10、可以利用 echo 这个命令来取用变量。变量在被取用时,前面必须要加上$
11、用『等号(=)』连接变量与他的内容可以配置或修改某个变量
12、
- 变量与变量内容以一个等号『=』来连结,如下所示:『myname=VBird』
- 等号两边不能直接接空格符,如下所示为错误: 『myname = VBird』或『myname=VBird Tsai』
- 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误: 『2myname=VBird』
- 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但可用跳脱字符『 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;
- 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』则『echo $var』可得『lang is en_US』 - 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
- 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
- 在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。 例如想要取得核心版本的配置:
『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』 - 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
『PATH="$PATH":/home/bin』 - 若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:
『export PATH』 - 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (非强制规定) ;
- 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:『unset myname』
13、在一串命令中,在 ` 之内的命令将会被先运行,而其运行出来的结果将做为外部的输入信息
14、用env 与 export 可以查看该shell环境下所有的环境变量。
15、set 除了环境变量之外, 还会将其他在 bash 内的变量通通显示出来。
16、变量“?”代表上一个运行的命令所回传的值。
当我们运行某些命令时, 这些命令都会回传一个运行后的代码。一般来说,如果成功的运行该命令, 则会回传一个 0 值,如果运行过程发生错误,就会回传『错误代码』
17、export: 自定义变量转成环境变量。因为子程序仅会继承父程序的环境变量, 子程序不会继承父程序的自定义变量。
那如何将环境变量转成自定义变量呢?可以使用declare。
18、变量的有效范围:我们在上头的export命令说明中,就提到了这个概念了。如果在跑程序的时候,有父程序与子程序的不同程序关系时, 则『变量』可否被引用与 export 有关。被 export 后的变量,我们可以称他为『环境变量』! 环境变量可以被子程序所引用,但是其他的自定义变量内容就不会存在于子程序中。
19、要读取来自键盘输入的变量,使用 read 这个命令
read [-pt] variable
选项与参数:
-p :后面可以接提示字符!
-t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
20、declare 或 typeset 是一样的功能,就是在『宣告变量的类型』。如果使用 declare 后面并没有接任何参数,那么 bash 就会主动的将所有的变量名称与内容通通叫出来,就好像使用 set 一样啦!
declare [-aixr] variable
选项与参数:
-a :将后面名为 variable 的变量定义成为数组 (array) 类型
-i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型
-x :用法与 export 一样,就是将后面的 variable 变成环境变量;
-r :将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset
范例一:让变量 sum 进行 100+300+50 的加总结果
[root@www ~]# sum=100+300+50
[root@www ~]# echo $sum
100+300+50 <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊!
[root@www ~]# declare -i sum=100+300+50
[root@www ~]# echo $sum
450
21、
- 变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 所以上述第一个运行的结果才会出现那个情况的;
- bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;
22、如果需要非字符串类型的变量,那就得要进行变量的宣告才行
23、
将 sum 变成环境变量
[root@www ~]# declare -x sum
让 sum 变成非环境变量的自定义变量吧!
[root@www ~]# declare +x sum <== 将 - 变成 + 可以进行『取消』动作
24、数组 (array) 变量类型
范例:配置上面提到的 var[1] ~ var[3] 的变量。 [root@www ~]# var[1]="small min" [root@www ~]# var[2]="big min" [root@www ~]# var[3]="nice min" [root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}" small min, big min, nice min
25、变量内容的删除:#和## 从前面开始删除, %和%%从后面开始删除
- # :符合取代文字的『最短的』那一个;
- ##:符合取代文字的『最长的』那一个;
26、
${变量/旧字符串/新字符串} ${变量//旧字符串/新字符串} |
若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』 |
27、在某些时刻我们常常需要『判断』某个变量是否存在,若变量存在则使用既有的配置,若变量不存在则给予一个常用的配置。
new_var=${old_var-content}
28、
变量配置方式 | str 没有配置 | str 为空字符串 | str 已配置非为空字符串 |
var=${str-expr} | var=expr | var= | var=$str |
var=${str:-expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${str:+expr} | var= | var= | var=expr |
var=${str=expr} | str=expr var=expr |
str 不变 var= |
str 不变 var=$str |
var=${str:=expr} | str=expr var=expr |
str=expr var=expr |
str 不变 var=$str |
var=${str?expr} | expr 输出至 stderr | var= | var=$str |
var=${str:?expr} | expr 输出至 stderr | expr 输出至 stderr | var=$str |
这个减号的测试并不会影响到旧变量的内容。 如果你想要将旧变量内容也一起替换掉的话,那么就使用等号 (=) 吧!
29、history查看历史命令,!number运行响应序号的命令,!!运行上一个命令。