1.Shell的变量

1.1 变量的作用

  • 在编写shell script时,可以利用变量来替代程序中常出现的串,这样编写起来既方便又利于修改。
  • bash有一个环境变量PATH,当你执行例如ls指令时,就是通过PATH这个变量里面的内容所记录的路径顺序来搜索指令的。

1.2 如何设置shell变量?

假设诸位都学过c语言,我用它来举例子说明shell的变量是怎么回事。c语言定义一个变量即type varName,变量类型+变量名。 而shell定义变量,举个例子,假设要定义一个变量name,name的内容为shell。 定义的方式共三种:

  1. name=shell
  2. name="shell"
  3. name='shell'

如果要查看变量内容的话,可以使用echo $name【注意点】:

  1. 三种变量定义方式“=”两端都不能添加空格符,否则会出错。
  2. 对于方式一,需要注意如果name的内容为shell□script,如若这样定义:name=shell□script会报错,“=”右端内容不能出现空格符“□”。解决办法:利用转义字符“\”,name=shell\□script
  3. 方式二可以支持“=”右端携带空格符“□”,name="shell□script",推荐使用含双引号说明变量内容的方式。
  4. 方式三也支持变量内容含空格符“□”,即name='shell□script',但和方式二区别在于,举例说明:name="$PATH"(PATH是bash自带的环境变量),如若使用echo $name,即可查看PATH的内容,但使用方式三定义:name='$PATH',输出结果就是$PATH,所以简单总结下,双引号内的特殊字符如“$”,可以保持原有特性,而单引号内的特殊字符会被视作一般字符。

1.2.1 变量的设定规则

  1. 变量与变量内容以一个“=”来连结。
  2. 变量名称只能是英文字母和数字,且首字符不能为数字。
  3. 可用转义字符“\”将特殊符号[$、□、'、Enter]变成一般字符。
  4. 在一串指令中,如果要利用其它指令提供的信息,可以使用反单引号“`命令`”或$(命令)
  5. 若要为变量扩增内容,可以采用${变量}"累加内容",还有其它方式也可以,不过推荐这种方式。
  6. 通常大写字符为系统默认变量,自定义变量使用小写字符,方便判断。

1.3 取用变量

即取消已经定义的变量,如要取消上面定义的变量name,直接unset name即可。 【注意点】: 如果变量name被设置为readonly,即定义变量的时候declare -r name="shell",那么该变量既不能unset,也无法改变变量内容。解决办法:注销后重新登录。

1.4 变量的作用范围

  • 环境变量:bash中环境变量可被子进程继承,即父进程中的环境变量在子进程中也能看到。
  • 自定义变量:不可被子进程继承,子进程中无法看到父进程中自定义的变量。

自定义变量==>环境变量:(两种方式)

  1. declare -x name
  2. export name

1.5 系统中默认的环境变量

查看默认环境变量的方式:

  1. env,env即environment的缩写。
  2. export,两者效果相同。

简单介绍几个常见的环境变量:

  • HOME,代表用户的家目录。
  • PATH,执行文件时搜索的路径,目录与目录间用“:”分隔。
  • RANDOM,随机数变量,你只要echo $RANDOM,就可以获得一个介于0~32767之间的数值。

命令set查看所有变量(环境变量、与bash操作接口相关的变量以及自定义变量):

重要变量:

  • PS1,与命令提示字符有关,比如[root@root /]#[user@localhost ~]$,一般bash预设的内容可能为[\u@\h \W]$,比如上面例子中的第2种方式。
  • $,“$”本身也是一个变量,代表本shell的PID。
  • ?,关于上个指令执行后的回传值,一般上条指令执行成功后,echo $?值为0,如果执行失败的话结果为非0。

1.6 变量的测试与内容替换

1.6.1 功能

判断某个变量是否存在,如果存在则沿用原来的变量内容,否则设置为某个固定内容。

1.6.2 用法

  1. username=${username-root},如果username被设置过,则该指令执行完成后其内容保持不变,否则username的内容会被置为root。
  2. username=${username:-root},与方式1的语法区别在于“-”前有“:”,含义区别在于:这种情况如果username被设置空串,会发生内容替换,即username被设置为root,而方式1则保持原来内容(空串)不变。

其实使用shell命令[ ! -z "$username" ] || username=root也能获得同样的效果,不过shell为我们提供了这种更简洁的方式,可以简要了解一下。

2.命令别名alias和unalias

如果你的常用命令比较长或者担心误删文件,命令别名可以很好的解决你的问题。

2.1 设置别名

如果要为这条命令ls -la | more设置别名lm,只需alias lm='ls -la | more'即可,语法简单,不做细解。

2.2 取消别名

如果要取消别名lm,只需执行unalias lm即可。

3.bash的环境配置文件

系统预先提供了一组环境配置文件,在bash启动时会读取这些配置文件,用来设置好bash的操作环境。前面讲过的自定义变量和命令别名,在重新登录bash后都会失效,除非你将它们写入某个环境配置文件才行。

3.1 配置文件分类

3.1.1 全体系统的配置文件

文件位于/etc/profile,这是系统的整体设定,最好不要修改这个文件。

3.1.2 用户个人的配置文件

根据启动bash读取配置文件的优先级,有以下3个:

  1. ~/.bash_profile(login shell读取)
  2. ~/.bash_login
  3. ~/.profile

一般常见的用户个人配置文件是.bash_profile。

3.2 source:读入环境配置文件的命令

一般你修改完环境配置文件后,需要注销再重新登录后,你的设定才会生效,如果想要立即生效,就可以使用命令source 配置文件名称. 配置文件名称也具有同样效果。(注意前面是一个点“.”)。

4.数据流重定向

  • 标准输入:<,<<

举例说明:

  1. cat < 1,表示从文件1从读取内容
  2. cat << “end”,输入时,当某一行内容仅为”end”时,就结束本次输入。
  • 标准输出:>,>>
  1. >:表示将标准输出的内容重定向到某个文件中(覆盖式)
  2. >>:同上(但区别在于它式追加式)
  • 标准错误:2>,2>>

同标准输出。

【注意点】:如果需要忽略错误信息(既不输出到屏幕同时也不保存到文件),则可以将其重定向到/dev/null(俗称黑洞装置)中。