基本操作

定义变量

变量名的命名规则:
  • 字母、数字、下划线
  • 不以数字开头
为变量赋值的过程,称为 变量替换
  1. # 变量名=变量值,等号两边不能有空格
  2. variable=value
  3. # 赋值字符,可以是单引号
  4. variable='value'
  5. # 也可以是双引号
  6. variable="value"
  7. # 使用 let 为变量赋值
  8. let a=10+20
  9. # 将命令赋值给变量
  10. l=ls
  11. # 将命令结果赋值给变量,使用 $() 或 ``
  12. letc=$(ls -l /etc)
  13. echo $letc
  14. letd=`ls -l /etc`
  15. echo $letd
  16. # 在列表中添加值
  17. list="Guangzhou Shenzhen Zhuhai"
  18. list=$list" Huizhou"
  19. echo $list
变量值有空格等特殊字符可以包含在 “”(双引号)或 ‘’(单引号)中。 variable 是变量,value 是赋给变量的值。 如果 value 不包含任何空白符(例如空格 Tab 缩进等),那么可以不使用引号;如果 value 包含了空白符,那么久必须使用引号包围起来。
⚠️ 注意,赋值号 = 的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样

使用变量

使用定义过的变量,需要在变量名前加美元符号 $ 即可:
  1. # 将字符串 "Steven" 赋值给变量 author
  2. author="Steven"
变量的引用:
  • ${变量名} 称作对变量的引用
  • echo ${变量名} 查看变量的值
  • ${变量名} 在部分情况下可以省略为 $变量名
  1. # 使用 echo 输出变量 author
  2. echo ${author}
  3. echo $author

修改变量

  1. author="Steven"
  2. echo ${author}
  3. author="Irenene"
  4. echo ${author}

只读变量

  1. slogan="Hello world!"
  2. readyonly slogan
  3. slogan="Hello Slogan."

删除变量

使用 unset 命令可以删除变量
  1. unset variable_name
变量被删除后不能再次使用,unset 命令不能删除只读变量。
  1. #!/bin/sh
  2. repository="http://tsejx.github.com/"
  3. unset repository
  4. echo $repository

作用范围

变量作用范围只在
  1. # 将 1 赋值给变量 a
  2. a=1
  3. # 打开新的子进程 bash
  4. bash
  5. # 输出变量 a,无内容
  6. echo $a
  7. # 将 2 赋值给变量 a(还是在子进程)
  8. a=2
  9. # 退出子进程
  10. exit
  11. # 输出变量 $a,值为 1
  12. echo $a
  13. # 执行某个脚本也是开启子进程,所以脚本内定义的变量对当前操作终端不生效
  14. bash xx.sh
如果要在当前终端执行环境内生效,可以采用下面的命令:
  1. source xx.sh

导出变量

使用 export 关键字可以让子进程获取到父进程的变量:
  1. author="Steven"
  2. export $author

特殊变量

  • $0 当前脚本的文件名
  • $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2,第 10 个以上参数是 ${10}${100}
  • $# 传递给脚本或函数的参数个数
  • $* 传递给脚本或函数的所有参数
  • $@ 传递给脚本或函数的所有参数

向脚本文件传递参数

  1. #!/bin/bash
  2. echo "Process ID: $$"
  3. echo "File Name: $0"
  4. echo "First Parameter: $1"
  5. echo "Second Parameter: $2"
  6. echo "All Parameters 1: $@"
  7. echo "All Parameters 2: $*"
  8. echo "Total: $#"
运行该脚本,并附带参数
  1. $ . ./test.sh Shell Linux
  2. Process ID: 10032
  3. File Name: test.sh
  4. First Parameter : Shell
  5. Second Parameter : Linux
  6. All parameters 1: Shell Linux
  7. All parameters 2: Shell Linux
  8. Total: 2

向函数传递参数

  1. #!/bin/bash
  2. #定义函数
  3. function func(){
  4. echo "Language: $1"
  5. echo "URL: $2"
  6. echo "First Parameter : $1"
  7. echo "Second Parameter : $2"
  8. echo "All parameters 1: $@"
  9. echo "All parameters 2: $*"
  10. echo "Total: $#"
  11. }
  12. #调用函数
  13. func Java Foo
运行结果:
  1. Language: Java
  2. URL: Foo
  3. First Parameter : Java
  4. Second Parameter : Foo
  5. All parameters 1: Java Foo
  6. All parameters 2: Java Foo
  7. Total: 2

获取上个命令的退出状态

$? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。
  1. #!/bin/bash
  2. if [ "$1" === 100 ]
  3. then
  4. exit 0 # 参数正确,退出状态为 0
  5. then
  6. exit 1 # 参数错误,退出状态为 1
  7. fi
exit 表示退出当前 Shell 进程,我们必须在新进程中运行 test.sh,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法取得它的退出状态了。
  1. $ bash ./test.sh 100
  2. # 上条命令是否正确执行,0-正确,1-不正确
  3. $ echo $?
  4. 0

获取函数的返回值

  1. #!/bin/bash
  2. #得到两个数相加的和
  3. function add(){
  4. return `expr $1 + $2`
  5. }
  6. add 30 50 #调用函数
  7. echo $? #获取函数返回值
运行结果 80 有 C++、C#、Java 等编程经验的读者请注意:严格来说,Shell 函数中的 return 关键字用来表示函数的退出状态,而不是函数的返回值;Shell 不像其它编程语言,没有专门处理返回值的关键字。

空的参数

当执行脚本文件时,第二个参数为空时
  1. ./a.sh -a
可以使用替换值:
  1. #!/bin/bash
  2. echo $1
  3. # 当第二个参数为空,输出后面值 _
  4. echo ${2}_
  5. # 参数替换,如果 $2 取值为空值,将下划线 `_` 为位置二赋值
  6. echo ${2-_}

系统环境变量

系统环境功能变量是每个 Shell 打开都可以或得到的变量。 查看环境变量:
  1. # 查看所有共享的环境变量
  2. export -p
  3. # 分页查看环境变量配置文件
  4. env | more
  5. # 查看某个单独变量
  6. echo $USER
  7. echo $UID
  8. echo $PATH
添加命令到当前环境变量路径:
  1. # 编写一个 Shell 脚本文件
  2. vim a.sh
  3. # (脚本文件)内含以下命令
  4. export "Hello Linux"
  5. # 编写保存后,查看当前脚本文件所在路径
  6. /root
  7. # 将当前路径添加到 $PAHT
  8. PAHT= $PATH:/root
  9. # 直接执行脚本文件,输出 "Hello Linux"
  10. a.sh
提示信息变量 $PS1

$HOME

这是一个指向用户目录的系统环境变量。 格式为 /Users//var/root(macOS),Linux 系统上为 /home/
  1. # mrsingsing 用户
  2. echo $HOME # /Users/mrsingsing
  3. # root 用户
  4. echo $HOME # /var/root
注意:因为大量的程序依赖 $HOME 环境变量,所以覆盖系统默认变量时很危险的。所以一般仅在当前 Session 有效。

$PATH

$PATH 环境变量说简单点就是一个字符串变量,当输入命令的时候 Linux 会去查找 $PATH 里面记录的路径。比如在根目录/下可以输入命令 ls,在 /usr 目录下也可以输入 ls,但其实 ls 这个命令根本不在这个两个目录下,事实上当你输入命令的时候 Linux 会去 /bin/usr/bin/sbin 等目录下面去找你此时输入的命令,而 $PATH 的值恰恰就是 /bin:/sbin:/usr/bin:…。其中的冒号使目录与目录之间隔开。

新增自定义路径

假设你新安装了一个命令在 /usr/local/new/bin 目录下,而你又想像 ls 一样在任何地方都使用这个命令,你就需要修改环境变量 $PATH 了,准确的说是为 $PATH 增加一个值 /usr/local/new/bin
  1. export PATH=$PATH:/usr/local/new/bin
该命令使 $PATH 自增 :/usr/local/new/bin。通常的做法是把这行 Bash 命令写到 /root/.bashrc 末尾,然后重新登录 Linux 系统时,新的默认路径就会添加进行。当然这里直接使用 source /root/.bashrc 执行这个文件相当于重新登录了。

删除自定义路径

当你发现新增的 /usr/local/new/bin 没用的时候,可以修改 /root/.bashrc 文件新增的路径,或修改 /etc/profile 文件删除你不需要的路径。

环境变量配置文件

配置文件:
  • /etc/profile
  • /etc/profile.d/
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc
凡是 /etc 下的配置文件是所有用户通用的配置文件。 用户家目录 ~ 配置文件保存用户特有的配置文件。