shell 变量

479 阅读3分钟

shell

shell是命令解释器、用于释放用户对操作系统的操作

centos7默认使用的shellbash

shell脚本

  • #开头的注释
  • 执行命令
    • bash ./filenaem.sh(使用bash执行不需要赋予执行权)

内建命令和外部命令的区别

  • 内建命令不需要创建子进程
  • 内建命令对当前的shell生效

shell变量

变量命名规则

  • 字母、数字、下划线
  • 不以数字开头

为变量赋值的过程、称为变量交换

#!/bin/sh
# 变量名=变量值 等号两边不能有空格
variable=value

# 赋值字符串、可以是单引号
variable='value'

# 赋值字符串、可以是双引号
variable="value"

# 使用let为变量赋值
let a=10+20

# 不使用let 则a是一个表达式
a=10+20
echo $a => 10+20

# 将命令赋值给变量
letc=ls

# 将命令结果赋值给变量、使用$() || ``
let c=$(ls -l)
echo $letc

# 在列表中添加值
list="a b c"
list=#list" d"
echo $list => "a b c d"

变量值有空格等特殊字符也可以包含在""(双引号)或''(单引号)中

注意

赋值号周围不能有空格、和我们日常js开发有点不同、需要注意一下

使用变量

使用定义过的变量、需要在变量前面加美元符号$

#!/bin/sh
# 将字符串"value" 赋值给var
var="value"
# 使用echo输出变量的值
echo $var => "value"

变量的引用

  • ${变量名}称作对变量的引用
  • echo${变量名}查看变量的值
  • ${变量名}在部分情况下可以省略为$变量名
#!/bin/sh
# 将字符串"value" 赋值给var
var="value"
# 使用echo输出变量的值
echo $var => "value"
echo ${var}
# 以上两种方式都是可以的

修改变量

#!/bin/sh
label="value"

echo ${label}

label="value1"

echo ${label}
# 输出结果为 "value" 和 "value1"

只读变量

#!/bin/sh
label="hello woeld!"

readonly label

label="hello ggt"
# 输出 readonly variable 不可以进行修改、是一个只读属性

删除变量

使用unset命令可以删除变量

#!/bin/sh
label="value"

unset label
# 变量删除后不能再次使用、`unset`命令不能删除只读变量

作用范围

#!/bin/sh
# 将 1 赋值给 a
a=1

# 打开新的子进程 bash
bash

# 输出变量 a (在子进程)
echo $a
# 这里是空、作用范围仅在当前进程

# 将 2 赋值给a(还是在子进程)
a=2

# 退出子进程
exit

# 输出变量 $a
ehco $a
# 值为1

# 执行某个脚本也是开启子进程、所以脚本定义的变量对当前操作终端不生效
bash xx.sh

# 如果要生效、可以执行以下命令
source xx.sh

导出变量

使用export关键字可以让子进程获取到父进程的变量

#!/bin/bash
label="value"
export $label
# 这里会报一个错、export: `"value"': not a valid identifier
# $label 是一个值、""
$export label
# 使用bash 去开一个子进程去访问 label

系统环境变量

系统换机功能变量是每个shell打开都可以获得到的变量

查看环境变量

#!/bin/bash
env | more
# 分页查看环境变量配置文件

# 查看某个单独的变量
echo $USER
echo $UID
echo $PATH

添加命令到当前环境变量路径

#!/bin/bash
# 编写一个shell脚本文件
vim a.sh

# (脚本文件)内含以下命令
export "hello linux"

# 编写保存后、产看当前脚本文件所在路径
/root

# 将当前路径添加到$PATH
PATH=$PATH:/root

# 执行脚本
a.sh
# 提示没有权限的时候 chmod u+r+x filename.sh

特殊变量

  • $0 当前脚本的文件名
  • $n传递给脚本或者函数的参数、n是一个数字、从$1-$9,第十个参数是${10}
  • $# 传递给脚本函数的参数个数
  • $* 传递给脚本或者函数的所有参数
  • $@ 传递给脚本或者参数的所有参数

向脚本文件传递参数

#!/bin/bash
echo "Process ID: $$"
# $$ 所有进程id
echo "File Name: $0"
# $0 脚本文件名
echo "First Parameter: $1"
# 传递给脚本或者函数的第一个参数
echo "Second Parameter: $2"
# 传递给脚本或者函数的第二个参数
echo "All Parameters 1: $@"
# 传递给脚本或者函数的所有参数
echo "All Parameters 2: $*"
echo "Total: $#"

# 运行这个脚本 并且传递参数 bash bash.sh shell linux
# shell为第一个参数、linux为第二个参数

向函数传递参数

#!/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: $#"
  # 所有参数
}

# 调用函数 javascript 为第一个参数、第二个是linux
func javascript linux

运行结果

Language: javascript
URL: linux
First Parameter : javascript
Second Parameter : linux
All parameters 1: javascript linux
All parameters 2: javascript linux
Total: 2

获取上个命令的退出状态

$?是一个特殊的变量、用来获取上一个命令的退出状态、或者上一个函数的返回值
#!/bin/bash

if [ "$1" === 100 ]
then
    exit 0 # 参数正确,退出状态为 0
then
    exit 1 # 参数错误,退出状态为 1
fi

`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 不像其它编程语言,没有专门处理返回值的关键字。

空的参数

当执行脚本文件时,第二个参数为空时、可以使用替换值
#!/bin/bash

echo $1

# 当第二个参数为空,输出后面值 _
echo ${2}_

# 参数替换,如果 $2 取值为空值,将下划线 `_` 为位置二赋值
echo ${2-_}

# 执行 bash bash.sh -a

环境变量配置文件

配置文件

  • etc/profile

  • etc/profile.d

  • ~/.bash_profile

  • ~/bashrc

  • /etc/bashrc

凡是 /etc 下的配置文件是所有用户通用的配置文件。