shell 之变量

内部变量之位置参数

变量 描述
$0 脚本文件本身的名字
$1,$2,…,$n n号命令行参数
$# 命令行参数的个数
“$*” 等同于”$1 $2 $3…”
“$@” 等同于”$1”,”$2”,”$3”,…

内部的shift命令: 位置参数的移位操作,$#的值减一,旧的$2变为$1,…,也可以shift n

自定义变量

  • 存储的内容:字符串,执行的过程中可以被修改。

  • 变量名: 字母开头,其余字符可以是数字,字母,下划线

  • 创建变量: name=1.12 等号两侧不能有空格

  • 引用变量: $name 或者 ${name}

当变量未定义时,变量值为空

shell内部一些开关 描述
set -u 当引用一个未定义的变量时,产生一个错误
set +u 当引用一个未定义的变量时,认为是一个空串
set -x 执行命令时,打印执行的命令及参数,前面冠以+号
set +x 取消上述设置

环境变量和局部变量

  • 创建的变量,默认为局部变量

  • 局部变量$\rightarrow$环境变量,使用export语句 export proto

  • 局部变量: shell启动的子进程继承环境变量,不继承局部变量

  • 子进程对环境变量的修改,不影响父进程的同名变量

几个环境变量

  • HOME: 用户主目录的路径名
  • PATH: 命令查找路径
  • TERM: 终端类型

另外: set命令列出当前所有变量及其值以及函数的定义, env累出环境变量及其值。

元字符

元字符 描述
空格,制表符 命令行参数的分隔符
回车 执行键入的命令
>,<, 重定向与管道
用于一行内输入多个命令(;;)
& 后台运行(&&)
$ 应用shell变量
` 反向单引号,用于命令替换
* [] ? 文件通配符
\ 去向后继字符的特殊作用,转义
() 用于定义shell函数或在子shell中执行一组命令

注: ()><|;&除本身意义外还可以起到分隔符的作用

转义

双引号 “”

  • 除$和`外特殊字符的特殊含义被取消,即仍可以使用命令替换和变量替换
  • 需要的转义: \”, \$, `, \

单引号

  • 对所括起的任何字符,不作任何特殊解释

  • 转义符代表斜杠本身,不许中间插入单引号

反撇号

  • \ 代表反斜线吱声
  • `代表反撇号本身

转义符后跟非特殊字符

  • 引号内,系统处理时尽量维持字面含义

  • 引号外,属于未定义的情况,最好不跟非特殊字符

shell 替换

  • 命令替换 name=cmd 或者name = $(cmd) , 代表着name=执行cmd的标准输出,

  • 变量替换 $name ${name}

  • 文件名替换 ls *.c

辅助的命令

命令 描述
read name 从标准输入读入一行内容赋值给变量
echo arg1 arg2 arg3 打印命令行参数,没两个间用1空格分开,最后打印换行符
echo -e arg1 arg2 arg3 除上面功能外,会打印转义符
printf ‘\033[01;33mConnect to %s Network\n’ $proto 打印

注:

echo转义 描述
\c 打印完毕,不换行
\b 退格
\n 换行
\r 回车
\t 水平制表
\ 反斜线
\nnn 八进制描述的字符ASCII码