环境和shell变量
$ variable-name = value 或 ${variable-name = value}
注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。shell变量可以用大小写字母。
表14-1变量设置时的不同模式
Variable-name=value 设置实际值到variable-name
Variable-name+value如果设置了variable-name,则重设其值
Variable-name:?value 如果未设置variable-name,显示未定义用户错误信息
Variable-name?value 如果未设置variable-name,显示系统错误信息
Variable-name:=value 如果未设置variable-name,设置其值Variable-name:-value 同上,但是取值并不设置到variable-name,可以被替换
显示变量直接echo,清除变量unset,可将多个变量结合使用
有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。
此命令格式为:
$ {variable : -value }意即如果设置了变量值,则使用它,如果未设置,则取新值。
$ { variable : =value }测试变量是否取值,如果未设置,则返回一空串。
方法如下:
$ { variable : +value }使用下述方法初始化变量为空字符串。v
ariable = " "$DETINATION = " "
如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人想要改变它,则返回错误信息。
格式如下:variable - name = valuereadonly variable-name
设置环境变量VARIABLE - NAME = value;export VARIABLE-NAME在两个命令之间是一个分号,也可以这样写:VARIABLE - NAME = valueExport VARIABLE-NAME用env查看所有环境变量,同样是用unset命令清楚环境变量
CDPATH改变目录路径变量,保留一系列由冒号隔开的路径名,用于cd命令。如果设置了CDPATH,cd一个目录时,首先查找CDPATH,如果CDPATH指明此目录,则此目录成为当前工作目录。
例子如下:$ CDPATH=:/home/dave/bin:/usr/local/apps;export CDPATH.
如果要$ cd appscd命令首先在C D PAT H中查找目录列表,如果发现a p p s,则它成为当前工作目录。
特定变量参数
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$$ 脚本运行的当前进程I D号
$! 后台运行的最后一个进程的进程I D号
$@ 与$ #相同,但是使用时加引号,并在引号中返回每个参数
$- 显示s h e l l使用的当前选项,与s e t命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
..那啥,又是草草略过总觉得不知其所以然
引号的重要性表
15-1 shell引用类型
" " 双引号 ` 反引号' ' 单引号 \ 反斜线
上次打了一段话做实验,发觉不行,原因是我用的是单引号而不是反引号,在实际过程中echo "中的命令可以使用反引号"
基础编程脚本不是复杂的程序,它是按行解释的。脚本第一行总是以#!/bin/sh开始,这段脚本通知shell使用系统上的Bourne shell解释器。
条件测试测试文件状态test一般有两种格式,即:test condition或[condition]使用方括号时,要注意在条件两边加上空格。
测试文件状态的条件表达式很多,但是最常用的可在表17-1中查到。
表17-1 文件状态测试
- d 目录
- s 文件长度大于0、非空
- f 正规文件
- w 可写
- L 符号连接
- u 文件有suid位设置
- r 可读
- x 可执行
使用两种方法测试文件scores.txt是否可写并用最后退出状态测试是否成功。记住, 0表示成功,其他为失败。
测试时使用逻辑操作符测试文件状态是否为OK,但是有时要比较两个文件状态
。shell提供三种逻辑操作完成此功能。-
a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
字符串测试是错误捕获很重要的一部分,特别在测试用户输入或比较变量时尤为重要。字符串测试有5种格式。
test "string"
test string_operator "string"
test "string" string_operator "string" [string_operator string] [string string_operator string]这里,string_operator可为:= 两个字符串相等。!= 两个字符串不等。
-z 空串。-n 非空串。
测试数值测试数值可以使用许多操作符,一般格式如下:"number"numeric_operator"number"或者["number"numeric_operator"number"]numeric_operator可为:
-eq 数值相等。
-ne 数值不相等。
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
expr用法expr命令一般用于整数值,但也可用于字符串。
一般格式为:expr argument operator argumentexpr也是一个手工命令行计数器。
退出状态在书写正确脚本前,大概讲一下退出状态。任何命令进行时都将返回一个退出状态。如果要观察其退出状态,使用最后状态命令:$ echo $?要退出当前进程,shell提供命令exit,一般格式为:exit n
注一笔,脚本本身加入退出脚本值是一个好的编程习惯
流控制if、then、else语句提供条件测试。测试可以基于各种条件。例如文件的权限、长度、数值或字符串的比较。这些测试返回值或者为真(0),或者为假(1)。基于此结果,可以进行相关操作。在讲到条件测试时已经涉及了一些测试语法。case语句允许匹配模式、单词或值。一旦模式或值匹配,就可以基于这个匹配条件作其他声明。
for 循环 每次处理依次列表内信息,直至循环耗尽。
Until 循环 此循环语句不常使用,u n t i l循环直至条件为真。条件部分在循环末尾部分。
While 循环 w h i l e循环当条件为真时,循环执行,条件部分在循环头。
i f语句测试条件,测试条件返回真( 0)或假(1)后,可相应执行一系列语句。 i f语句结对错误检查非常有用。其格式为:if 条件1then 命令1elif 条件2then 命令2else 命令3if
if语句可用来测试传入脚本中参数的个数。使用特定变量 $ #,表示调用参数的个数。可以测试所需参数个数与调用参数个数是否相等。
有时需要知道脚本运行是交互模式(终端模式)还是非交互模式(cron或at)。脚本也许需要这个信息以决定从哪里取得输入以及输出到哪里,使用test命令并带有- t选项很容易确认这一点。如果t e s t返回值为1,则为交互模式。
$ variable-name = value 或 ${variable-name = value}
注意,等号两边可以有空格。如果取值包含空格,必须用双引号括起来。shell变量可以用大小写字母。
表14-1变量设置时的不同模式
Variable-name=value 设置实际值到variable-name
Variable-name+value如果设置了variable-name,则重设其值
Variable-name:?value 如果未设置variable-name,显示未定义用户错误信息
Variable-name?value 如果未设置variable-name,显示系统错误信息
Variable-name:=value 如果未设置variable-name,设置其值Variable-name:-value 同上,但是取值并不设置到variable-name,可以被替换
显示变量直接echo,清除变量unset,可将多个变量结合使用
有时要测试是否已设置或初始化变量。如果未设置或初始化,就可以使用另一值。
此命令格式为:
$ {variable : -value }意即如果设置了变量值,则使用它,如果未设置,则取新值。
$ { variable : =value }测试变量是否取值,如果未设置,则返回一空串。
方法如下:
$ { variable : +value }使用下述方法初始化变量为空字符串。v
ariable = " "$DETINATION = " "
如果设置变量时,不想再改变其值,可以将之设置为只读方式。如果有人包括用户本人想要改变它,则返回错误信息。
格式如下:variable - name = valuereadonly variable-name
设置环境变量VARIABLE - NAME = value;export VARIABLE-NAME在两个命令之间是一个分号,也可以这样写:VARIABLE - NAME = valueExport VARIABLE-NAME用env查看所有环境变量,同样是用unset命令清楚环境变量
CDPATH改变目录路径变量,保留一系列由冒号隔开的路径名,用于cd命令。如果设置了CDPATH,cd一个目录时,首先查找CDPATH,如果CDPATH指明此目录,则此目录成为当前工作目录。
例子如下:$ CDPATH=:/home/dave/bin:/usr/local/apps;export CDPATH.
如果要$ cd appscd命令首先在C D PAT H中查找目录列表,如果发现a p p s,则它成为当前工作目录。
特定变量参数
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
$$ 脚本运行的当前进程I D号
$! 后台运行的最后一个进程的进程I D号
$@ 与$ #相同,但是使用时加引号,并在引号中返回每个参数
$- 显示s h e l l使用的当前选项,与s e t命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
..那啥,又是草草略过总觉得不知其所以然
引号的重要性表
15-1 shell引用类型
" " 双引号 ` 反引号' ' 单引号 \ 反斜线
上次打了一段话做实验,发觉不行,原因是我用的是单引号而不是反引号,在实际过程中echo "中的命令可以使用反引号"
基础编程脚本不是复杂的程序,它是按行解释的。脚本第一行总是以#!/bin/sh开始,这段脚本通知shell使用系统上的Bourne shell解释器。
条件测试测试文件状态test一般有两种格式,即:test condition或[condition]使用方括号时,要注意在条件两边加上空格。
测试文件状态的条件表达式很多,但是最常用的可在表17-1中查到。
表17-1 文件状态测试
- d 目录
- s 文件长度大于0、非空
- f 正规文件
- w 可写
- L 符号连接
- u 文件有suid位设置
- r 可读
- x 可执行
使用两种方法测试文件scores.txt是否可写并用最后退出状态测试是否成功。记住, 0表示成功,其他为失败。
测试时使用逻辑操作符测试文件状态是否为OK,但是有时要比较两个文件状态
。shell提供三种逻辑操作完成此功能。-
a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
字符串测试是错误捕获很重要的一部分,特别在测试用户输入或比较变量时尤为重要。字符串测试有5种格式。
test "string"
test string_operator "string"
test "string" string_operator "string" [string_operator string] [string string_operator string]这里,string_operator可为:= 两个字符串相等。!= 两个字符串不等。
-z 空串。-n 非空串。
测试数值测试数值可以使用许多操作符,一般格式如下:"number"numeric_operator"number"或者["number"numeric_operator"number"]numeric_operator可为:
-eq 数值相等。
-ne 数值不相等。
-gt 第一个数大于第二个数。
-lt 第一个数小于第二个数。
-le 第一个数小于等于第二个数。
-ge 第一个数大于等于第二个数。
expr用法expr命令一般用于整数值,但也可用于字符串。
一般格式为:expr argument operator argumentexpr也是一个手工命令行计数器。
退出状态在书写正确脚本前,大概讲一下退出状态。任何命令进行时都将返回一个退出状态。如果要观察其退出状态,使用最后状态命令:$ echo $?要退出当前进程,shell提供命令exit,一般格式为:exit n
注一笔,脚本本身加入退出脚本值是一个好的编程习惯
流控制if、then、else语句提供条件测试。测试可以基于各种条件。例如文件的权限、长度、数值或字符串的比较。这些测试返回值或者为真(0),或者为假(1)。基于此结果,可以进行相关操作。在讲到条件测试时已经涉及了一些测试语法。case语句允许匹配模式、单词或值。一旦模式或值匹配,就可以基于这个匹配条件作其他声明。
for 循环 每次处理依次列表内信息,直至循环耗尽。
Until 循环 此循环语句不常使用,u n t i l循环直至条件为真。条件部分在循环末尾部分。
While 循环 w h i l e循环当条件为真时,循环执行,条件部分在循环头。
i f语句测试条件,测试条件返回真( 0)或假(1)后,可相应执行一系列语句。 i f语句结对错误检查非常有用。其格式为:if 条件1then 命令1elif 条件2then 命令2else 命令3if
if语句可用来测试传入脚本中参数的个数。使用特定变量 $ #,表示调用参数的个数。可以测试所需参数个数与调用参数个数是否相等。
有时需要知道脚本运行是交互模式(终端模式)还是非交互模式(cron或at)。脚本也许需要这个信息以决定从哪里取得输入以及输出到哪里,使用test命令并带有- t选项很容易确认这一点。如果t e s t返回值为1,则为交互模式。
评论