变量名的命名规则:
为变量赋值的过程,称为 变量替换。
# 变量名=变量值,等号两边不能有空格variable=value# 赋值字符,可以是单引号variable='value'# 也可以是双引号variable="value"# 使用 let 为变量赋值let a=10+20# 将命令赋值给变量l=ls# 将命令结果赋值给变量,使用 $() 或 ``letc=$(ls -l /etc)echo $letc# 在列表中添加值list="Guangzhou Shenzhen Zhuhai"list=$list" Huizhou"echo $list
变量值有空格等特殊字符可以包含在 ""
(双引号)或 ''
(单引号)中。
variable
是变量,value
是赋给变量的值。
如果 value
不包含任何空白符(例如空格 Tab 缩进等),那么可以不使用引号;如果 value
包含了空白符,那么久必须使用引号包围起来。
⚠️ 注意,赋值号
=
的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样
使用定义过的变量,需要在变量名前加美元符号 $
即可:
# 将字符串 "Steven" 赋值给变量 authorauthor="Steven"
变量的引用:
${变量名}
称作对变量的引用echo ${变量名}
查看变量的值${变量名}
在部分情况下可以省略为 $变量名
# 使用 echo 输出变量 authorecho ${author}echo $author
author="Steven"echo ${author}author="Irenene"echo ${author}
slogan="Hello world!"readyonly sloganslogan="Hello Slogan."
使用 unset
命令可以删除变量
unset variable_name
变量被删除后不能再次使用,unset
命令不能删除只读变量。
#!/bin/shrepository="http://tsejx.github.com/"unset repositoryecho $repository
变量作用范围只在
# 将 1 赋值给变量 aa=1# 打开新的子进程 bashbash# 输出变量 a,无内容echo $a# 将 2 赋值给变量 a(还是在子进程)a=2# 退出子进程exit# 输出变量 $a,值为 1echo $a# 执行某个脚本也是开启子进程,所以脚本内定义的变量对当前操作终端不生效bash xx.sh
如果要在当前终端执行环境内生效,可以采用下面的命令:
source xx.sh
使用 export
关键字可以让子进程获取到父进程的变量:
author="Steven"export $author
$0
当前脚本的文件名$n
传递给脚本或函数的参数。n
是一个数字,表示第几个参数。例如,第一个参数是 $1
,第二个参数是 $2
,第 10 个以上参数是 ${10}
、${100}
$#
传递给脚本或函数的参数个数$*
传递给脚本或函数的所有参数$@
传递给脚本或函数的所有参数#!/bin/bashecho "Process ID: $"echo "File Name: $0"echo "First Parameter: $1"echo "Second Parameter: $2"echo "All Parameters 1: $@"echo "All Parameters 2: $*"echo "Total: $#"
运行该脚本,并附带参数
$ . ./test.sh Shell LinuxProcess ID: 10032File Name: test.shFirst Parameter : ShellSecond Parameter : LinuxAll parameters 1: Shell LinuxAll parameters 2: Shell LinuxTotal: 2
#!/bin/bash#定义函数function func(){echo "Language: $1"echo "URL: $2"echo "First Parameter : $1"echo "Second Parameter : $2"echo "All parameters 1: $@"echo "All parameters 2: $*"echo "Total: $#"}#调用函数func Java Foo
运行结果:
Language: JavaURL: FooFirst Parameter : JavaSecond Parameter : FooAll parameters 1: Java FooAll parameters 2: Java FooTotal: 2
$?
是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。
#!/bin/bashif [ "$1" === 100 ]thenexit 0 # 参数正确,退出状态为 0thenexit 1 # 参数错误,退出状态为 1fi
exit
表示退出当前 Shell 进程,我们必须在新进程中运行 test.sh
,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法取得它的退出状态了。
$ bash ./test.sh 100# 上条命令是否正确执行,0-正确,1-不正确$ echo $?0
#!/bin/bash#得到两个数相加的和function add(){return `expr $1 + $2`}add 30 50 #调用函数echo $? #获取函数返回值
运行结果 80
。
有 C++、C#、Java 等编程经验的读者请注意:严格来说,Shell 函数中的 return
关键字用来表示函数的退出状态,而不是函数的返回值;Shell 不像其它编程语言,没有专门处理返回值的关键字。
当执行脚本文件时,第二个参数为空时
./a.sh -a
可以使用替换值:
#!/bin/bashecho $1# 当第二个参数为空,输出后面值 _echo ${2}_# 参数替换,如果 $2 取值为空值,将下划线 `_` 为位置二赋值echo ${2-_}
系统环境功能变量是每个 Shell 打开都可以或得到的变量。
查看环境变量:
# 查看所有共享的环境变量export -p# 分页查看环境变量配置文件env | more# 查看某个单独变量echo $USERecho $UIDecho $PATH
添加命令到当前环境变量路径:
# 编写一个 Shell 脚本文件vim a.sh# (脚本文件)内含以下命令export "Hello Linux"# 编写保存后,查看当前脚本文件所在路径/root# 将当前路径添加到 $PAHTPAHT= $PATH:/root# 直接执行脚本文件,输出 "Hello Linux"a.sh
提示信息变量 $PS1
。
这是一个指向用户目录的系统环境变量。 格式为 /Users/<username>
或 /var/root
(macOS),Linux 系统上为 /home/<username>
。
# mrsingsing 用户echo $HOME # /Users/mrsingsing# root 用户echo $HOME # /var/root
注意:因为大量的程序依赖 $HOME
环境变量,所以覆盖系统默认变量时很危险的。所以一般仅在当前 Session 有效。
$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
。
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
下的配置文件是所有用户通用的配置文件。
用户家目录 ~
配置文件保存用户特有的配置文件。