bash的使用
- 格式:pdf
- 大小:141.99 KB
- 文档页数:4
bash的使⽤
bash的⼯作特殊之命令执⾏状态返回值和命令展开所涉及的内容及其⽰例
什么是Bash 什么是Shell Bash 是 GNU Bourne-Again SHell,是⽬前⼤多数Linux发⾏版采⽤的Shell。
Shell 是 *nix提供给⽤户使⽤的界⾯。
⼀个操作系统的底层是独⽴运⾏的,⽤户界⾯和底层分开,可以最⼤限度的保证系统稳定。Shell就是⼀个特殊的程序,负责
接受⽤户的命令,并把系统的响应返回给⽤户。
Bash Shell⼀般不需要⾃⼰安装,在安装发⾏版的同时都会安装好。
Shell的存在是和登陆相关的,从⽤户名密码验证通过以后,Shell就启动了,知道你退出,Shell就结束了运⾏。
除了Bash Shell之外,还有很多其他的Shell。
1、bash基本语法
下⾯看⼀个简单的shell⽂件():
#!/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(需要有可执⾏权限)
2. 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 #输出2000x=expr $x+1echo $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语句返回字符串变量。
例⼦:
#!/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.命令⾏展开
~:⾃动展开为⽤户的家⽬录,或指定的⽤户的家⽬录;
{}:花括号展开。可承载⼀个以逗号分隔的路径列表,并能够将其展开为多个路径;