Linux-shell学习笔记1

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运行响应序号的命令,!!运行上一个命令。

posted @ 2019-06-12 15:48  ZhangCui  阅读(196)  评论(0编辑  收藏  举报