1.变量定义
shell变量名称的开头是一个字母或下划线符号,后面可接任意长度字母、数字或下划线符号。
变量赋值的方式为:变量名称=值,中间无空格,单行可多次赋值。如val0=abc val1=kjh
如果要获得变量的值,需在变量名称前加$字符,如val2=$val1,shell会对$(...)里的算术表达式进行计算
当所赋予的值包含空格时,需加引号,如val3=“abc def hji”
要将多个变量连接起来时,要加引号,如val4=“$val0 $val1 $val2 $val3”
2.内置的shell变量
# | 目前进程的参数个数 |
@ | 传递给当前进程的命令行参数。置于双引号内,会展开为个别的参数 |
* | 当前进程的命令行参数。置于双引号内,会展开为一单独参数 |
- | 在引用是给予shell的选项 |
? | 前一命令的退出状态 |
$ | shell进程的进程编号 |
0 | shell程序的名称 |
! | 最后一个后台命令的进程编号 |
HOME | 根目录 |
IFS | 内部的字段分割器 |
LANG | 当前locale的默认名称 |
LC_ALL | 当前locale的名称 |
PATH | 命令的查找路径 |
PPID | 父进程的进程编号 |
PS1 | 主要的命令提示字符串。默认为“$” |
PS2 | 行继续的提示字符串。默认为“>” |
PS4 | 以set -x设置的执行跟踪的提示字符串。默认为“+” |
PWD | 当前工作目 |
3.命令行参数
第一个参数表示为$1,第二个$2,当大于10时,加{},如第十个${10}
$# 提供传递到shell脚本或函数的参数总数
$*,$@ 一次表示所有的命令行参数
"$*" 将所有参数视为单个字符串="$1 $2..."
"$@" 将所有参数视为单独的个体="$1""$2"...
4.变量模式匹配
${varname:-word} 如果varname存在且非null,则返回其值;否则返回word
${varname:=word} 如果varname存在且非null,则返回它的值;否则设置它为word,并返回其值
${varname:?message} 如果varname存在且非null,则返回它的值;否则显示varname:message,并退出命令或脚本
${varname:+word} 如果varname存在且非null,则返回word;否则返回null
(:)冒号可省略,如果省略,则“存在且非null”改为“存在”
${varname#pattern} 如果模式匹配于变量值的开头,则删除匹配的最短部分,并返回剩下的部分
${varname##pattern} 如果模式匹配于变量值的开头,则删除匹配的最长部分,并返回剩下的部分
${varname%pattern} 如果模式匹配于变量值的结尾,则删除匹配的最短部分,并返回剩下的部分
${varname%%pattern} 如果模式匹配于变量值的结尾,则删除匹配的最长部分,并返回剩下的部分
5.特殊符号
|--重定向运算符;<、>、>>、| 、<>
|--》set -C
| 执行上面的命令可打开shell所谓的禁止覆盖选项,如>重定向遇到目标文件存在时,就会失败
|--》以<>打开一个文件作为输入输出
| 一般来说,<以只读模式打开文件,>只写,<>则是可读可写,如program<>file
|--》文件描述符
| 0、1、2对应标准输入输出及出错
|--》exec:在当前shell中启动新程序,不过此为单向操作,控制权不肯能够回到脚本,唯一例外是新程序无法调用