bash的工作特殊之命令执行状态返回值和命令展开所涉及的内容及其示例
什么是Bash 什么是Shell Bash 是 GNU Bourne-Again SHell,是目前大多数Linux发行版采用的Shell。
Shell 是 *nix提供给用户使用的界面。
一个操作系统的底层是独立运行的,用户界面和底层分开,可以最大限度的保证系统稳定。Shell就是一个特殊的程序,负责接受用户的命令,并把系统的响应返回给用户。
Bash Shell一般不需要自己安装,在安装发行版的同时都会安装好。
Shell的存在是和登陆相关的,从用户名密码验证通过以后,Shell就启动了,知道你退出,Shell就结束了运行。
除了Bash Shell之外,还有很多其他的Shell。
1、bash基本语法
下面看一个简单的shell文件(HelloWorld.sh):
#!/bin/bash
#This is an example
echo Hello World
(1)“#!”是说明这个文件类型的,Linux系统根据“#!”及其后面的字符串确定该文件的类型,/bin/bash表名该文件是一个bash程序,需要由/bin目录下的bash程序来解释执行。bash程序一般放在/Bin目录下,可以用命令“locate bash”,“whereis bash”,“find / -name bash >/dev/null”来找出bash安装位置。
(2)“#”是bash文件的注释,表示以#开头的一行是注释信息;echo是回显命令,将其后的内容输出到标准输出。Bash程序中绝大部分语句结束时没有分号。
(3)执行bash程序:sh HelloWorld.sh 或者./HelloWorld.sh(需要有可执行权限)
bash变量
bash中的变量是不能含有保留字,不能含有“-”等保留字符,也不能含有空格。
在bash中,变量是不需要提前定义的,只要前面没有被定义过,就可以直接使用。一般使用变量的第一条语句是赋初值,若不赋初值,默认为NULL。
例子:
#!/bin/bash
#This is an example
STR="Hello World"
echo $STR
(1)变量赋值时,“=”号左右两边都不能有空格。
(2)bash语句不需要分号(“;”)结尾。
(3)除了变量赋值和在for语句循环头中,bash变量在使用时都需要加“$”。
(4)Bash程序是在一个新的进程中运行,该程序中的变量命名,赋值和使用不会影响其他进程或者原始shell变量已存在的值(相当于C++中的局部变量作用域?)
(5)以单引号括起来的变量将不再被解释为变量,如'$STR'将被解释为一个字符串。更为标准的变量引用方式是“${变量名}”,例子中是省略了{}的简化写法。在复杂的程序中,为了不引起歧义,一般要加上“{}”。
(6)bash变量没有类型的分别,一个变量可以被定义为字符串,也可以再被定为为整数,取决于变量的用途。
例子:
#!/bin/bash
x=1999
let "x=$x+1"
echo $x #输出2000
x=expr $x+1
echo $x #输出2000+1
x="Hello"$x
echo $x #输出Hello2000+1
在shell中对整数变量的运算有“+ - * / %”,一般通过let和expr这两个指令来实现(但从上面的例子可以看到,let进行的是整数运算,expr进行的是字符串替换)。
(7)在比较操作上,整数变量和字符串变量不同:
操作 整数 字符串
相同 -eq =
不同 -ne !=
大于 -gt >
小于 -lt <
大于或等于 -ge
小于或等于 -le
为空 -z
不为空 -n
如:
比较字符串变量a和b是否相等就写作:if [$a=$b]
比较整数变量a和b是否相等写作:if [$a -eq $b]
(8)除了整数和字符串之外,bash变量还可以作为文件变量操作。bash中没有浮点数运算。
运算符
含义( 满足下面要求时返回 TRUE )
-e file 文件 file 已经存在
-f file 文件 file 是普通文件
-s file 文件 file 大小不为零
-d file 文件 file 是一个目录
-r file 文件 file 对当前用户可以读取
-w file 文件 file 对当前用户可以写入
-x file 文件 file 对当前用户可以执行
-g file 文件 file 的 GID 标志被设置
-u file 文件 file 的 UID 标志被设置
-O file 文件 file 是属于当前用户的
-G file 文件 file 的组 ID 和当前用户相同
file1 -nt file2 文件 file1 比 file2 更新
file1 -ot file2 文件 file1 比 file2 更老
file,file1,和file2代表文件路径。
3.局部变量
在bash程序中,如果用了一个变量,该变量到程序的结尾一致有效。
局部变量存在于一个局部程序块中,只要在赋初值时加上local关键字,就可以声明一个局部变量。
例子:
#!/bin/bash
HELLO=Hello
funtion hello{
local HELLO=World
echo $HELLO
}
echo $HELLO
hello
echo $HELLO
该程序的执行结果是:
Hello
World
Hello
4.函数
function my_funcname {
code block
}
my_funcname() {
code block
}
(1)左边的写法“{” 之前要有空格,否则会有错误:syntax error near unexpected token `echo'
(2)函数的参数并不需要在定义时就指定,只需要通过bash保留变量$1,$2……来引用就可以了。
(3)函数的返回值可以用return语句来制定返回一个特定的整数,如果没有指定,则返回最后一条语句的执行结果(成功返回0,失败返回错误代码)。函数的返回值通过“$?”保留字来获得。BASH要求返回值必须为一个整数,不能有return语句返回字符串变量。
例子:square.sh
#!/bin/bash
square(){
let "res=$1*$1"
return $res
}
square $1
result=$?
echo $result
exit 0
bash命令执行状态返回值
在bash中使用一个特殊的变量$?来保存上一个命令的执行状态结果。 (变量$的取值范围在0-255之间)
主要之含义:
0:正常结束
1:通用执行错误
2:误用shell命令
126:命令不可执行
127:命令未找到
128:无效退出参数
130:被ctrl-c强行中止
255:退出状态码越界
*在0-255范围内的所有值只有返回值为0是表示成功。
例:
exit $?
127
通过命令exit $?获取bash的返回值为127
bash命令展开
以某些bash能够解释的符号来代替命令中的某些参数。
~:展开为用户的家目录;
例:切换至家目录
cd ~;pwd
/root
{}:可承载一个以逗号分隔的列表,并将其展开为多个路径;
例:在/tmp/d目录下创建f1,f2,f3三个文件
touch /tmp/d/f{1,2,3}
bash
附:
bash特性之命令别名
获取当前用户可用的别名的定义:
这里写图片描述
bash的特性之命令历史
命令语法格式:
history [-c] [-d OFFSET] [n]
history -anrw [FILENAME]
history -ps VALUE [VALUE…]
-c: 清空命令历史;
-d offset(偏移量):删除指定命令历史,offset为history显示出来的命令数字
-r: 从文件读取命令历史至历史列表中;
-w:把历史列表中的命令追加至历史文件中;
history #:显示最近的#条命令;
bash特性之快捷键
Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
Ctrl+u:删除行首至光标所在处之间的所有字符;
Ctrl+k:删除光标所在处至行尾的所有字符;
Ctrl+l:清屏,相当于clear
bash的特性之命令补全和路径补全
1.命令查找和补全机制:
(1) 查找内部命令;
(2) 根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;
(3) 给定开头的部分字符串如果能惟一标识某命令程序文件,则直接补全;
不能惟一标识某命令程序文件,再击tab键一次,会给出列表;
2.路径补全
在给定起始路径下,以对应路径下的打头字串逐一匹配起始路径下每个文件:
TAB按键;
如果能惟一标识,则直接补全;
否则,再一次tab,给出列表;
3.命令行展开
~:自动展开为用户的家目录,或指定的用户的家目录;
{}:花括号展开。可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;