# shell编程注意事项

# shell变量

Shell 支持以下三种定义变量的方式：

```
variable=value
variable='value'
variable="value"
```

variable 是变量名，value 是赋给变量的值。如果 value 不包含任何空白符（例如空格、Tab缩进等），那么可以不使用引号；如果 value 包含了空白符，那么就必须使用引号包围起来。

## 注意1：赋值号的周围不能有空格

赋值号 = 的周围不能有空格，错误写法：`variable = value`

## 注意2：单引号和双引号的区别

```shell
#!/bin/bash

h="hello"
w="world"
hw1="hw is ${h} ${w}"
hw2='hw is ${h} ${w}'
echo $hw1
echo $hw2
```

运行结果：
`hw is hello world`
`hw is ${h} ${w}`

- 以单引号`‘ ’`包围的变量为纯字符，不会对里面的变量或者命令进行解析。
- 以双引号`“ ”`包围的变量，输出时先解析里面的变量和命令，而不是把双引号中的变量名和命令原样输出。



## 将命令的结果赋值给变量

Shell 也支持将命令的执行结果赋值给变量，常见的有以下两种方式：

```shell
variable=`command`
variable=$(command)
```

第一种方式把命令用反引号包围起来，反引号和单引号非常相似，容易产生混淆，所以不推荐使用这种方式；

第二种方式把命令用`$()`包围起来，区分更加明显，所以推荐使用这种方式。

## 只读变量

使用 **readonly** 命令可以将变量定义为只读变量，只读变量的值不能被改变。

下面的例子尝试更改只读变量，结果报错：

```shell
#!/bin/bash
h="hello"
readonly h
h="hi"
```

运行脚本，结果会提示h为只读变量

## 删除变量

使用 **unset** 命令可以删除变量。语法：

```shell
unset variable_name
```

变量被删除后不能再次使用；`unset` 命令不能删除只读变量。

## 变量类型

运行shell时，会同时存在三种变量：

#### 1) 局部变量

局部变量在脚本或命令中定义，仅在当前shell实例中有效，其他shell启动的程序不能访问局部变量。

#### 2) 环境变量

所有的程序，包括shell启动的程序，都能访问环境变量，有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

#### 3) shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量，有一部分是局部变量，这些变量保证了shell的正常运行

# Shell参数传递

| 变量 | 含义                                                         |
| ---- | ------------------------------------------------------------ |
| $0   | 当前脚本的文件名                                             |
| $n   | 传递给脚本或函数的参数。n 是一个数字，表示第几个参数。例如，第一个参数是$1，第二个参数是$2。 |
| $#   | 传递给脚本或函数的参数个数。                                 |
| $*   | 传递给脚本或函数的所有参数。这些参数是一整个字符串           |
| $@   | 传递给脚本或函数的所有参数。被双引号(" ")包含时，与 $* 稍有不同，下面将会讲到。 |
| $?   | 上个命令的退出状态，或函数的返回值。                         |
| $$   | 当前Shell进程ID。对于 Shell 脚本，就是这些脚本所在的进程ID。 |

## $* 和 $@ 的区别

`$* `和 `$@ `都表示传递给函数或脚本的所有参数，不被双引号(" ")包含时，都以`"$1" "$2" … "$n"` 的形式输出所有参数。

但是当它们被双引号(" ")包含时，`"$*"` 会将所有的参数作为一个整体，以`"$1 $2 … $n"`的形式输出所有参数；`"$@"` 会将各个参数分开，以`"$1" "$2" … "$n"` 的形式输出所有参数。

## 退出状态

`$?` 可以获取上一个命令的退出状态。所谓退出状态，就是上一个命令执行后的返回结果。

退出状态是一个数字，一般情况下，大部分命令执行成功会返回 0，失败返回 1。

不过，也有一些命令返回其他值，表示不同类型的错误。





bsub

-I -R 

# source
{'avg_line_length': 16.635658914728683, 'max_line_length': 110, 'alphanum_fraction': 0.6011183597390494, 'licenses': ['Apache-2.0'], 'repository_name': 'luolaihua/luo-blogs', 'path': '17_shell/envsetenv.md', 'size': 4146, 'lang': 'Markdown'}