1. shell是什么?
shell是交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令的程序语言。
1.1 shell的分类
Shell 类别 | 易学性 | 可移植性 | 编辑性 | 快捷性 |
---|---|---|---|---|
Bourne Shell (sh) | 容易 | 好 | 较差 | 较差 |
Korn Shell (ksh) | 较难 | 较好 | 好 | 较好 |
Bourne Again (Bash) | 难 | 较好 | 好 | 好 |
POSIX Shell (psh) | 较难 | 好 | 好 | 较好 |
C Shell (csh) | 较难 | 差 | 较好 | 较好 |
TC Shell (tcsh) | 难 | 差 | 好 | 好 |
Shell 的两种主要语法类型有 Bourne 和 C,这两种语法彼此不兼容。Bourne 家族主要包括 sh、ksh、Bash、psh、zsh;C 家族主要包括:csh、tcsh (Bash 和 zsh 支持部分 csh 的语法)。
在Linux中,我们通过/etc/shells文件查询系统中支持的shell。
phato@phato:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
2. shell脚本的执行方式
1. echo命令
[root@localhost ~]# echo [选项] [输出内容]
选项:
-e: 支持反斜线控制的字符转换(具体参见下表)
-n: 取消输出后行末的换行符号(就是内容输出后不换行)
phato@phato:~$ echo "Mr.phato is the most honest man!"
Mr.phato is the most honest man!
[root@localhost ~]$ echo -e "\\ \a"
\
这个输出会输出\,同时会在系统音响中输出一声提示音
[root@localhost ~]$ echo -e "ab\bc"
ac
这个输出中,在 b 键左侧有“\b”,所以输出时只有 ac
[root@phato ~]$ echo -e "a\tb\tc\nd\te\tf"
a b c
d e f
我们加入了制表符“\t”和换行符“\n”,所以会按照格式输出
[root@phato ~]$ echo -e "\0141\t\0142\t\0143\n\0144\t\0145\t\0146"
a b c
d e f
还是会输出上面的内容,不过是按照八进制 ASCII 码输出的。
[root@phato ~]$ echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
a b c
d e f
如果按照十六进制 ASCII 码也同样可以输出
[root@localhost ~]$ echo -e "\e[1;31m abcd \e[0m"
这条命令会把 abcd 按照红色输出。解释下这个命令\e[1 是标准格式,
代表颜色输出开始,\e[0m代表颜色输出结束,31m 定义字体颜色是红色。
echo 能够识别的颜色如下:30m=黑色,31m=红色,32m=绿色,33m=黄色,
34m=蓝色,35m=洋红,36m=青色,37m=白色。
[root@localhost ~]$ echo -e "\e[1;42m abcd \e[0m"
这条命令会给 abcd 加入一个绿色的背景。
echo 可以使用的背景颜色如下:40m=黑色,41m=红色,42m=绿色,
43m=黄色,44m=蓝色,45m=洋红,46m=青色,47m=白色。
在 echo 命令中如果使用了“-e”选项,则可以支持控制字符。
控制字符 | 作 用 |
---|---|
\ | 输出\本身 |
\a | 输出警告音 |
\b | 退格键,也就是向左删除键 |
\c | 取消输出行末的换行符。和“-n”选项一致 |
\e | ESCAPE 键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车键 |
\t | 制表符,也就是 Tab 键 |
\v | 垂直制表符 |
\0nnn | 按照八进制 ASCII 码表输出字符。其中 0 为数字零,nnn 是三位八进制数 |
\xhh | 按照十六进制 ASCII 码表输出字符。其中 hh 是两位十六进制数 |
2. shell脚本的执行
[root@localhost sh]$ vi hello.sh
#!/bin/Bash
#The first program
# Author: shenchao (E-mail: phato@qq.com)
echo -e "Mr. phato is the most honest man. "
Shell 脚本写好了,在 Linux 中的执行有这样两种方法:
- 赋予执行权限,直接运行
这种方法是最常用的 Shell 脚本运行方法,也最为直接简单。就是赋予执行权限之后,直接运行。
[root@localhost sh]$ chmod 755 hello.sh
赋予执行权限
[root@localhost sh]$ /root/sh/hello.sh
Mr. phato is the most honest man.
使用绝对路径运行
[root@localhost sh]$ ./hello.sh
Mr. phato is the most honest man.
* 通过Bash调用执行脚本
[root@localhost sh]$ bash hello.sh
Mr. phato is the most honest man.
3. Bash的基本功能
1.history命令
[root@localhost ~]# history [选项] [历史命令保存文件]
选项:
-c: 清空历史命令 (不建议清空)
-w: 把缓存中的历史命令写入历史命令保存文件。如果不手工指定历史命令保存文件,则放入默认历史命令保存文件~/.bash_history 中。
[root@localhost ~]$ history -w
把缓存中的历史命令直接写入~/.bash_history
[root@localhost ~]$ history -c
清空历史命令
修改histroy命令条数:
[root@localhost ~]$ vi /etc/profile
…省略部分输出…
HISTSIZE=1000
2.history命令的调用
如果想要使用原先的历史命令有这样几种方法:
- 使用上、下箭头调用以前的历史命令
- 使用“ !n ”重复执行第 n 条历史命令
- 使用“ !! ”重复执行上一条命令
- 使用“ !字串 ”重复执行最后一条以该字串开头的命令
- 使用“ !$ ”重复上一条命令的最后一个参数
3. 别名的优先级
1、 第一顺位执行用绝对路径或相对路径执行的命令。
2、 第二顺位执行别名。
3、 第三顺位执行 Bash 的内部命令。
4、 第四顺位执行按照$PATH 环境变量定义的目录查找顺序找到的第一个命令。
为了让这个别名永久生效,可以把别名写入环境变量配置文件“~/.bashrc”。命令如下:[root@localhost ~]# vi /root/.bashrc
4. Bash常用快捷键
快捷键 | 作 用 |
---|---|
ctrl+A | 把光标移动到命令行开头。 |
ctrl+E | 把光标移动到命令行结尾。 |
ctrl+C | 强制终止当前的命令。 |
ctrl+L | 清屏,相当于 clear 命令。 |
ctrl+U | 删除或剪切光标之前的命令。 |
ctrl+K | 删除或剪切光标之后的内容。 |
ctrl+Y | 粘贴 ctrl+U 或 ctrl+K 剪切的内容。 |
ctrl+R | 在历史命令中搜索内容, |
ctrl+D | 退出当前终端。 |
ctrl+Z | 暂停,并放入后台。 |
ctrl+S | 暂停屏幕输出。 |
ctrl+Q | 恢复屏幕输出。 |
5. 输入输出重定向
1.Bash的标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
2.输出重定向
类 型 | 符 号 | 作用 |
---|---|---|
标准输出重定向 | 命令 > 文件 命令 >> 文件 |
以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中。 以追加的方式,把命令的正确输出输出到指定的文件或设备当中。 |
标准错误输出重定向 | 错误命令 2>文件 错误命令 2>>文件 |
以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中。 以追加的方式,把命令的错误输出输出到指定的文件或设备当中。 |
正确输出和错误输出 同时保存 |
命令 > 文件 2>&1 命令 >> 文件 2>&1 命令 &>文件 命令 &>>文件 命令>>文件 1 2>>文件 2 |
以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。 以追加的方式,把正确输出和错误输出都保存到同一个文件当中。 把正确的输出追加到文件 1 中,把错误的输出追加到文件 2 中。 |
3.输入重定向
[root@localhost ~]# wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数
-l 统计行数
6. 多命令顺序执行
多命令执行符 | 格式 | 作 用 |
---|---|---|
; | 命令 1 ;命令 2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令 1 && 命令 2 | 当命令 1 正确执行,则命令 2 才会执行 当命令 1 执行不正确,则命令 2 不会执行 |
|| | 命令 1 ||命令 2 | 当命令 1 执行不正确,则命令 2 才会执行 当命令 1 正确执行,则命令 2 不会执行 |
如果写if语句,要先写&&后写||来代替,因为否则&&前有两个条件。
7. 管道符
[root@localhost ~]# grep [选项] "搜索内容" 文件名
选项:
-A 数字: 列出符合条件的行,并列出后续的 n 行
-B 数字: 列出符合条件的行,并列出前面的 n 行
-c: 统计找到的符合条件的字符串的次数
-i: 忽略大小写
-n: 输出行号
-v: 反向查找
1. find 和 grep 的区别
- find 命令是在系统当中搜索符合条件的文件名,如果需要模糊查询,使用通配符进行匹配,搜索时文件名是完全匹配。
- grep 命令是在文件当中搜索符合条件的字符串,如果需要模糊查询,使用正则表达式进行匹配,搜索时字符串是包含匹配。
注意:find 命令是可以通过-regex 选项识别正则表达式规则的,也就是说 find 命令可以按照正则表达式规则匹配,而正则表达式是模糊匹配。
8. 通配符
通配 符 | 作 用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配 0 个或任意多个任意字符,也就是可以匹配任何内容 |
[] | 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是 a,或者是 b,或者是 c。 |
[-] | 匹配中括号中任意一个字符,-代表一个范围。例如:[a-z]代表匹配一个小写字母。 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配一个不是数字的字符。 |
9. Bash中其他特殊符号
符 号 | 作 用 |
---|---|
'' | 单引号。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义。 |
"" | 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的殊含义。 |
`` | 反引号。反引号括起来的内容是系统命令,在 Bash 中会先执行它。和(),因为反引号非常容易看错。 |
$() | 和反引号作用一样,用来引用系统命令。 |
( ) | 用于一串命令执行时,()中的命令会在子 Shell 中运行 |
{ } | 用于一串命令执行时,{}中的命令会在当前 Shell 中执行。也可以用于变量变形与替换。 |
[ ] | 用于变量的测试。 |
# | 在 Shell 脚本中,#开头的行代表注释。 |
$ | 用于调用变量的值,如需要调用变量 name 的值时,需要用$name 的方式得到变量的值。 |
\ | 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不当做是变量引用。 |
在我们的 Bash 中,是可以调用新的 Bash 的,因此原Shell就是父Shell,新Shell就是子Shell。比如:
[root@localhost ~]$ bash
这时,我们通过 pstree 命令查看一下进程数:
[root@localhost ~]$ pstree
init─┬─abrt-dump-oops
…省略部分输出
├─sshd─┬─sshd───bash───bash───pstree
知道了父 Shell 和子 Shell,我们接着解释小括号和大括号的区别。如果是用于一串命令的执行,那么小括号和大括号的主要区别在于:
- ( )执行一串命令时,需要重新开一个子 shell 进行执行
- { }执行一串命令时,是在当前 shell 执行;
- ( )和{ }都是把一串的命令放在括号里面,并且命令之间用;号隔开;
- ( )最后一个命令可以不用分号;
- { }最后一个命令要用分号;
- { }的第一个命令和左括号之间必须要有一个空格;
- ( )里的各命令不必和括号有空格;
- ( )和{ }中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令。
4. Bash的变量和运算符
1. 什么是变量
在定义变量时,有一些规则需要遵守:
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。
- 在 Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
- 变量用等号连接值,等号左右两侧不能有空格。
- 变量的值如果有空格,需要使用单引号或双引号包括。如:test="hello"。其中双引号括起来的内容“$”、“\”和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符。
- 在变量的值中,可以使用“\”转义符。
- 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含"{变量名}包含变量名。
2. 变量的分类
- 用户自定义变量:这种变量是最常见的变量,由用户自由定义变量名和变量的值。
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据,比如当前登录用户,用户的家目录,命令的提示符等。不是太好理解吧,那么大家还记得在 Windows 中,同一台电脑可以有多个用户登录,而且每个用户都可以定义自己的桌面样式和分辨率,这些其实就是Windows 的操作环境,可以当做是 Windows 的环境变量来理解。环境变量的变量名可以自由定义,但是一般对系统起作用的环境变量的变量名是系统预先设定好的。
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变
量作用是固定的。 - 预定义变量:是 Bash 中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
变量分类 | 名称 | 作用 | 内容 |
---|---|---|---|
用户自定义变量 | 自定义 | 自定义 | 自定义 |
用户自定义环境变量 | 自定义 | 自定义 | 自定义 |
系统自带环境变量 | 确定 | 确定 | 自定义 |
位置参数变量 | 确定 | 确定 | 自定义 |
预定义变量 | 确定 | 确定 | 自定义 |
3. 用户自定义变量 (增删查改)
1. 变量定义
[root@localhost ~]$ 2name="shen chao"
-bash: 2name=shen chao: command not found
变量名不能用数字开头
[root@localhost ~]$ name = "shenchao"
-bash: name: command not found
等号左右两侧不能有空格
[root@localhost ~]$ name=shen chao
-bash: chao: command not found
变量的值如果有空格,必须用引号包含
2. 变量调用
[root@localhost ~]$ name="shen chao"
定义变量 name
[root@localhost ~]$ echo $name
shen chao
输出变量 name 的值
3. 变量查看
[root@localhost ~]# set [选项]
选项:
-u: 如果设定此选项,调用未声明变量时会报错。
-x: 如果设定此选项,在命令执行之前,会把命令先输出一次
4. 变量删除
[root@localhost ~]# unset 变量名
4. 环境变量
1. 环境变量设置
[root@localhost ~]# export age="18"
使用 export 声明的变量即是环境变量,也可以如下
[root@localhost ~]#age="18"
[root@localhost ~]#export age
2. 环境变量的查询和删除
env 命令和 set 命令的区别是,set 命令可以查看所有变量,而 env 命令只能查看环境变量。
[root@localhost ~]$ unset gender
[root@localhost ~]$ env | grep gender
#删除环境变量 gender
3. 系统默认环境变量
[root@localhost ~] env
HOSTNAME=localhost.localdomain 主机名
SHELL=/bin/bash 当前的 shell
TERM=linux 终端环境
HISTSIZE=1000 历史命令条数
SSH_CLIENT=192.168.4.159 4824 22 ssh 连接,记录客户端 ip
SSH_TTY=/dev/pts/1 ssh 连接的终端时 pts/1
USER=root 当前登录的用户
age=18 我们刚刚定义的环境变量
PATH=/usr/lib/qt3.3/bin:/usr/local/sbin:
/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/
root/bin 系统查找命令的路径
MAIL=/var/spool/mail/root 用户邮箱
PWD=/root 当前所在目录
LANG=zh_CN.UTF-8 语系
HOME=/root 当前登录用户的家目录
SHLVL=2 当前在第二层子 shell 中。
LOGNAME=root 登录用户
_=/bin/env 上次执行命令的最后一个参数或命令本身
env 命令可以查询到所有的环境变量,可是还有一些变量虽然不是环境变量,却是和 Bash 操作接口相关的变量,这些变量也对我们的 Bash 操作终端起到了重要的作用。这些变量就只能用 set 命令来查看了。
[root@localhost ~]$ set
BASH=/bin/bash ←Bash 的位置
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1"
[4]="release" [5]="i386-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release' ←bash 的版本
COLORS=/etc/DIR_COLORS ←颜色记录文件
HISTFILE=/root/.bash_history ←历史命令保存文件
HISTFILESIZE=1000 ←在文件当中记录的历史命令最大条数
HISTSIZE=1000 ←在缓存中记录的历史命令最大条数
LANG=zh_CN.UTF-8 ←语系环境
MACHTYPE=i386-redhat-linux-gnu ←软件类型是 i386 兼容类型
MAILCHECK=60 ←每 60 秒去扫描新邮件
PPID=2166 ←父 shell 的 PID。我们当前 Shell 是一个子 shell
PS1='[\u@\h \W]\$ ' ←命令提示符
PS2='> ' ←如果命令一行没有输入完成,第二行命令的提示符
UID=0 ←当前用户的 UID
PATH 变量:系统查找命令的路径
先查询下 PATH 环境变量的值:
[root@localhost ~]# echo $PATH
/usr/lib/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PATH 变量的值是用“:”分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入了一个程序名,如果没有写入路径,系统就会到 PATH 变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报“命令没有发现”的错误。
实现直接运行脚本的两种方式
[root@localhost ~]$ cp /root/sh/hello.sh /bin/
拷贝 hello.sh 到/bin 目录
[root@localhost ~]$ hello.sh
Mr. phato is the most honest man.
hello.sh 可以直接执行了
------------------------------------------------------------------
[root@localhost ~]$ PATH="$PATH":/root/sh
在变量 PATH 的后面,加入/root/sh 目录
[root@localhost ~]$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin
:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/sh
查询 PATH 的值,变量叠加生效了
PS1变量:命令提示符
PS1 是一个很有意思的变量(这可不是 SONY 的游戏机哦),是用来定义命令行的提示符的,可以
安装我们自己的需求来定义自己喜欢的提示符。PS1 可以支持以下这些选项:
- \d:显示日期,格式为“星期 月 日”
- \H:显示完整的主机名。如默认主机名“localhost.localdomain”
- \h:显示简写主机名。如默认主机名“localhost”
- \t:显示 24 小时制时间,格式为“HH:MM:SS”
- \T:显示 12 小时制时间,格式为“HH:MM:SS”
- \A:显示 24 小时制时间,格式为“HH:MM”
- @:显示 12 小时制时间,格式为“HH:MM am/pm”
- \u:显示当前用户名
- \v:显示 Bash 的版本信息
- \w:显示当前所在目录的完整名称
- \W:显示当前所在目录的最后一个目录
- #:执行的第几个命令
- $:提示符。如果是 root 用户会显示提示符为“#”
LANG语系变量
LANG 变量定义了 Linux 系统的主语系环境
[root@localhost src]$ echo $LANG
zh_CN.UTF-8
我们还能通过文件/etc/sysconfig/i18n 定义系统的默认语系
[root@localhost src]$ cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"
5. 位置参数变量
位置参数变量 | 作 用 |
---|---|
$n | n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}. |
$* | 这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
6. 预定义变量
预定义变量 | 作 用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0,则证明上一个命令执行不正确了。 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
7. 接受键盘输入
[root@localhost ~]$ read [选项] [变量名]
选项:
-p “提示信息”: 在等待 read 输入时,输出提示信息
-t 秒数: read 命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数: read 命令只接受指定的字符数,就会执行
-s: 隐藏输入的数据,适用于机密信息的输入
变量名:
变量名可以自定义,如果不指定变量名,会把输入保存入默认变量 REPLY
如果只提供了一个变量名,则整个输入行赋予该变量
如果提供了一个以上的变量名,则输入行分为若干字,
一个接一个地赋予各个变量,而命令行上
8. Shell的运算符
既然所有变量的默认类型是字符串型,使用 declare 命令就可以实现声明变量的类型。命令如下:
[root@localhost ~]# declare [+/-][选项] 变量名
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-a: 将变量声明为数组型
-i: 将变量声明为整数型(integer)
-r: 讲变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,
也不能删除变量,甚至不能通过+r 取消只读属性
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
[root@localhost ~]$ aa=11
[root@localhost ~]$ bb=22
给变量 aa 和 bb 赋值
[root@localhost ~]$ declare -i cc=$aa+$bb
声明变量 cc 的类型是整数型,它的值是 aa 和 bb 的和
[root@localhost ~]$ echo $cc
33
这下终于可以相加了
[root@localhost ~]$ name[0]="shen chao"
数组第一个变量是沈超 第一个办公桌
[root@localhost ~]$ name[1]="li ming"
数组第二个变量是李明 第二个办公桌
[root@localhost ~]$ name[2]="tong gang"
数组第三个变量是佟刚, 第三个办公桌
[root@localhost ~]$ echo ${name}
shen chao
输出数组的内容,如果只写数组名,那么只会输出第一个下标变量
[root@localhost ~]$ echo ${name[*]}
shen chao li ming tong gang
输出数组所有的内容
[root@localhost ~]$ declare -x test=123
把变量 test 声明为环境变量
[root@localhost ~]$ declare -r test
给 test 赋予只读属性
[root@localhost ~]$ test=456
-bash: test: readonly variable
test 变量的值就不能修改了
[root@localhost ~]$ declare +r test
-bash: declare: test: readonly variable
也不能取消只读属性
[root@localhost ~]$ unset test
-bash: unset: test: cannot unset: readonly variable
也不能删除变量
[root@localhost ~]$ declare -p cc
declare -i cc="33"
#cc 变量是 int 型
[root@localhost ~]$ declare -p name
declare -a name='([0]="shen chao" [1]="li ming" [2]="tong gang")'
#name 变量是数组型
[root@localhost ~]$ declare -p test
declare -rx test="123"
test 变量是环境变量和只读变量
[root@localhost ~]$ declare +x test
取消 test 变量的环境变量属性
[root@localhost ~]$ declare -p test
declare -r test="123"
注意,只读变量属性是不能取消的
[root@localhost ~]$ declare -p cc
declare -i cc="33"
cc 变量是 int 型
[root@localhost ~]$ declare -p name
declare -a name='([0]="shen chao" [1]="li ming" [2]="tong gang")'
name 变量是数组型
[root@localhost ~]$ declare -p test
declare -rx test="123"
test 变量是环境变量和只读变量
[root@localhost ~]$ declare +x test
取消 test 变量的环境变量属性
[root@localhost ~]$ declare -p test
declare -r test="123"
注意,只读变量属性是不能取消的
网友评论