本地wordpress建站,龙岩做网站价格,广州搜狗快速排名原,网站网页访问权限1 shell变量基础 shell变量是一种很“弱”的变量#xff0c;默认情况下#xff0c;一个变量保存一个串#xff0c;shell不关心这个串是什么含义。所以若要进行数学运算#xff0c;必须使用一些命令例如let、declare、expr、双括号等。shell变量可分为两类#xff1a;局部变… 1 shell变量基础 shell变量是一种很“弱”的变量默认情况下一个变量保存一个串shell不关心这个串是什么含义。所以若要进行数学运算必须使用一些命令例如let、declare、expr、双括号等。shell变量可分为两类局部变量和环境变量。局部变量只在创建它们的shell中可用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的其他的则是专用shell变量。变量名必须以字母或下划线字符开头。其余的字符可以是字母、数字(0~9)或下划线字符。任何其他的字符都标志着变量名的终止。名字是大小写敏感的。给变量赋值时等号周围不能有任何空白符。为了给变量赋空值可以在等号后跟一个换行符。用set命令可以查看所有的变量unset var命令可以清除变量varvar相当于没有定义过。readonly var可以把var变为只读变量定义之后不能对var进行任何更改。对shell变量的引用方式很多用这些方式可以方便的获取shell变量的值变量值的长度变量的一个字串变量被部分替换后的值等等。shell变量常见引用方式如下 2 环境变量 环境变量的定义方法如下 varvalue export var shell在初始化的时候会在执行profile等初始化脚本脚本中定义了一些环境变量这些变量会在创建子进程时传递给子进程。 用env命令可以查看当前的环境变量。常用的系统环境变量如下 _(下划线) 上一条命令的最后一个参数 BASH 展开为调用bash实例时使用的全路径名 CDPATH cd命令的搜索路径。它是以冒号分隔的目录列表shell通过它来搜索cd命令指定的目标目录。例如.:~:/usr EDITOR 内置编辑器emacs、gmacs或vi的路径名 ENV 每一个新的bash shell(包括脚本)启动时执行的环境文件。通常赋予这个变量的文件名是.bashrc。 EUID 展开为在shell启动时被初始化的当前用户的有效ID GROUPS 当前用户所属的组 HISTFILE 指定保存命令行历史的文件。默认值是~/.bash_history。如果被复位交互式shell退出时将不保存命令行历史 HISTSIZE 记录在命令行历史文件中的命令数。默认是500 HOME 主目录。未指定目录时cd命令将转向该目录 IFS 内部字段分隔符一般是空格符、制表符和换行符用于由命令替换循环结构中的表和读取的输入产生的词的字段划分 LANG 用来为没有以LC_开头的变量明确选取的种类确定locale类 OLDPWD 前一个工作目录 PATH 命令搜索路径。一个由冒号分隔的目录列表shell用它来搜索命令一个普通值为 /usr/gnu/bin:/usr/local/bin:/usr/ucb:/usr/bin PPID 父进程的进程ID PS1 主提示符串默认值是$ PS2 次提示符串默认值是 PS3 与select命令一起使用的选择提示符串默认值是#? PS4 当开启追踪时使用的调试提示符串默认值是。追踪可以用set –x开启 PWD 当前工作目录。由cd设置 RANDOM 每次引用该变量就产生一个随机整数。随机数序列可以通过给RANDOM赋值来初始化。如果RANDOM被复位即使随后再设置它也将失去特定的属性 REPLY 当没有给read提供参数时设置 SHELL 当调用shell时它扫描环境变量以寻找该名字。shell给PATH、PS1、PS2、MAILCHECK和IFS设置默认值。HOME和MAIL由login(1)设置 SHELLOPTS 包含一列开启的shell选项比如braceexpand、hashall、monitor等 UID 展开为当前用户的用户ID在shell启动时初始化 3 数值变量 shell中默认把变量值当作字符串例如 age22 age${age}1 echo ${age} 输出结果为221而不是23因为shell将其解释为字符串而不是数学运算。 可以用let命令使其进行数学运算例如 let age${age}1 也可以用declare把变量定义为整型。例如 declare -i age22 这里就用 -i 选项把age定义为整型的了。此后每次运算都把age的右值识别为算术表达式或数字。 4 数组 在shell中可以使用数组例如 array[0]0 array[1]1 array[2]2 则array就是一个数组也可以这样给数组初始化 array(0 1 2) // 元素之间以空格分隔 可以通过 ${array[$i]}来访问array中某个元素${array[*]} 的返回值即数组的所有元素组成的串${#array[*]} 的返回值即数组的元素个数${array[*]:0:2} 返回第一个和第二个元素组成的串。0表示开始的位置2表示要返回的元素个数开始位置可以为0-2(0减去2)之类的表示从倒数第二个元素开始。 下面写个稍微复杂点的例子 1 #!/bin/bash
2 for ((i0; i100; i))
3 do
4 array[$i]$i
5 done
6 for ((i0; i100; i))
7 do
8 echo ${array[$i]}
9 done 如果要使用二维数组甚至三维数组该怎么实现呢那就需要用eval命令来模拟数组的功能了。 eval命令的作用是扫描命令两次再执行如果不使用eval只扫描一次然后执行。看个例子 rootsuse:~$ nameBarry rootsuse:~$ $namehello Barryhello: command not found 为什么第二句给Barry变量赋值会出错呢从报错信息可以发现shell并没有识别这是个赋值语句而是把Barryhello当作一个命令来执行当然会报错。为什么不能识别这是赋值语句呢第一次扫描时因为扫描到$符号所以不能把这句当作赋值语句赋值语句的左边总是一个变量名而不应该是$开头的。所以第一次扫描仅仅识别了$name变量并做了替换而并没有认识到赋值语句。 如果使用eval $namehello呢 rootsuse:~$ nameBarry rootsuse:~$ $namehello Barryhello: command not found rootsuse:~$ eval $namehello rootsuse:~$ echo $Barry hello 可见使用了eval之后对 $namehello 第一次扫描替换了$name没有识别赋值语句第二次扫描识别是赋值语句然后执行。现在大约可以想到怎样用eval实现二维数组了。 下面实现的二维数组每一行代表一个人的信息记录包括姓名年龄。 1 for ((i0; i2; i))2 do3 for ((j0; j2; j))4 do 5 read man$i$j6 done7 done8 echo next print:9 for ((i0; i2; i))
10 do
11 for ((j0; j2; j))
12 do
13 eval echo -n \$man$i$j:
14 done
15 printf \n
16 done 5 特殊变量 $0当前脚本的文件名 $numnum为从1开始的数字$1是第一个参数$2是第二个参数${10}是第十个参数 $#传入脚本的参数的个数 $*所有的位置参数(作为单个字符串) $所有的位置参数(每个都作为独立的字符串)。 $?当前shell进程中上一个命令的返回值如果上一个命令成功执行则$?的值为0否则为其他非零值常用做if语句条件 $$当前shell进程的pid $!后台运行的最后一个进程的pid $-显示shell使用的当前选项 $_之前命令的最后一个参数