Shell 变量
一、定义变量
定义变量时,变量名不需要加美元符号($)。
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
二、使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可。
三、只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
myUrl="http://www.baidu.com";
readonly myUrl;
四、删除变量
使用 unset 命令可以删除变量。
语法:
unset variable_name;
五、Shell 字符串
1.字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。
注意:
单引号里的任何字符都会原样输出。
双引号里可以有变量、转义字符。
2. 获取字符串长度
string="abcd";
echo ${#string}; #输出 4
3. 提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="aa bb cc dd ee";
echo ${string:1:4}; # 输出 a bb
4. 查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="aa bb cc dd ee";
echo `expr index "$string" b` # 输出 4
六、Shell 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似与 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
1. 定义数组
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。
定义数组的一般形式为:
数组名=(值1 值2 ... 值n);
2. 读取数组
读取数组元素值的一般格式是:${数组名[下标]}。
例如:valuen=${array_name[n]};
使用@ 或 * 可以获取数组中的所有元素。
例如:echo ${array_name[*]};
echo ${array_name[@]};
3. 获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同。
例如:
#取得数组元素的个数
length=${#array_name[@]}
length=${#array_name[*]}
#取得数组单个元素的长度
lengthn=${#array_name[n]}
七、Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,$0 为执行的文件名,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
另外,还有几个特殊字符用来处理参数:
参数处理 说明
$# 传递到脚本的参数个数。
$* 以一个单字符串显示所有向脚本传递的参数。不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,"*" 等价于 "1 2 3"(传递了一个参数)。
$@ 以一个单字符串显示所有向脚本传递的参数。不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,"@" 等价于 "1" "2" "3"(传递了三个参数)。
$$ 脚本运行的当前进程ID号。
$! 后台运行的最后一个进程的ID号。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
八、Shell test 命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
1.数值测试
参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
2.字符串测试
参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
3.文件测试
参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
九、Shell 函数
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
shell中函数的定义格式如下:
[ function ] funname [()]
{
action;
[return int;]
}
十、Shell 输入/输出重定向
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
重定向命令列表如下:
命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
十一、/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
十二、Shell 文件包含
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
Shell 文件包含的语法格式如下:
. filename # 注意点号(.)和文件名中间有一空格
或
source filename