SHELL
Intro(SHELL) #
Shell环境 #
Shell 变成跟JavaScript,php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Linux下面的shell很多,常见的有:
查看当前使用的shellecho $SHELL
;
一般约定为#!
后面跟解释器路径#!/bin/sh
#!/bin/bash
#!/sbin/sh
名称 路径 Bourne Shell /usr/bin/sh 或者 /bin/sh
Bourne Again Shell /bin/bash
C Shell /usr/bin/csh
K Shell /usr/bin/ksh
Shell for Root /sbin/sh
…… ……
Shell变量 #
定义变量 #
Comment
定义变量时,变量名不加美元符号($) ,而且变量之间不能有空格。
变量命名遵循以下原则:
- 只能使用英文字母,数字和下划线,首字母不能数字开头
- 不能使用标点符号
- 不可使用关键字(help查看)有效的shell变量名示例
除了显示赋值外,还可以使用语句给变量赋值
变量类型 #
Comment
运行shell时,会同时存在三种变量
- 局部变量 ,再脚本或命令中定义,仅在当前shell实例中有效
- 环境变量 ,所有程序,包括shell启动的程序
- 特殊变量, 特殊变量: 有一些特殊变量在 Shell 中具有特殊含义,例如 \(0 表示脚本的名称,\)1, \(2, 等表示脚本的参数。\)#表示传递给脚本的参数数量,$? 表示上一个命令的退出状态等。
使用变量 #
Comment
使用一个定义过的变量,只要在变量名前面加美元符即可。变量名外的花括号是可选的,加不加都行,加是为了帮助解释器识别变量的边界。例:(已定义的变量可以重新赋值)
只读变量 #
Comment
使用
readonly
命令可以将变量定义为只读变量,只读变量的值不能被改变
修改只读变量会出现如下错误:bash: name: readonly variable
删除变量 #
Comment
使用
unset
命令可以删除变量,删除后变量不可再次使用,unset命令不能删除只读变量
(unset -f name
)
Shell字符串 #
字符床是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。
Shell 中的中括号用法总结 #
Shell 里面的中括号(包括单中括号与双中括号) 可用于一些条件的测试:通常可以代替 test命令。
- 算数比较:
[ $var -eq 0 ]
- 文件属性测试:
[ -e $var ]
[ -d $var ]
- 字符串比较:
[[ $var = $var ]]
文件系统属性测试 #
操作符 意义 [ -f ] 文件 [ -d ] 目录 [ -x ] 可执行 [ -w ] 可写 [ -r ] 可读 [ -e ] 文件或者目录 [ -c ] 字符设备文件 [ -b ] 块设备文件 [ -p ] 命名管道 [ -s ] 套接字 [ -L ] 符号链接 双括号(字符串比较) #
操作符 意义 [[ != ]] [[ = ]] [[ == ]] 等于 [[ -z ]] 空字符串 [[ -n ]] 非空字符串 - 算数比较:
Shell参数传递 #
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为 $n,n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数。例如可以使用 $1、$2 等来引用传递给脚本的参数,其中 $1 表示第一个参数,$2 表示第二个参数,依此类推。
以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):特殊参数 #
参数处理 说明 $#
传递到脚本的参数个数 $*
以一个单字符串显示所有向脚本传递的参数。如 "$*"
用「"」括起来的情况、以"$1 $2 … $n"
的形式输出所有参数。$$
脚本运行的当前进程ID号 $!
后台运行的最后一个进程的ID号 $@
与 $*
相同,但是使用时加引号,并在引号中返回每个参数。如"$@"
用「"」括起来的情况、以"$1" "$2" … "$n"
的形式输出所有参数。$-
显示Shell使用的当前选项,与set命令功能相同。 $?
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 Caution
$*
与$@
区别:1).
相同点:都是引用所有参数。2).
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
Extands #
检测是否存在某个文件的命令 #
运行Shell 脚本的两种方法 #
- 作为可执行程序
一定要写成
./test.sh
,而不是 test.sh ,运行其他二进制的程序也一样。如果直接写成 test.sh ,Linux系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin,/sbin,/usr/bin,/usr/sbin 等在 PATH 里面,当前目录通常不在 PATH 里,所以会找不到命令,要用./
告诉系统在当前目录找。- 作为解释器参数
/bin/sh test.sh
/bin/bash test.sh
Linux文件权限 #
Linux 系统中每个文件的权限都有可读(
r
),可写(w
),可执行(x
)这三种权限,它们分别对应权限数值4
,2
,1
.系统为每个文件和目录都设有默认的权限,每个文件中可分拥有者(u
),同群组的用户(g
)和其他用户(o
),所有用户用(a
)。
对于每个文件,都有不同的组成信息,如图所示:修改文件权限的命令:
chmod [-cfvR] [--help] [--version] mode file...
修改文件所属用户和组的命令:(一般只有root才可使用)
chown [-cfhvR] [--help] [--version] user[:group] file...
Linux帮助命令help、man、info #
- 实验内容
使用帮助工具和文档
内建命令与外部命令之分
内建命令
实际上是shell程序的一部分,其中包含的是一些比较简单的Linux命令,这些命令写在源码的builtins里面,由shell程序识别并在shell程序内部完成运行,通常在Linux系统加载运行时shell就被加载并驻留在系统内存中。而且解析内部命令shell不需要创建子进程,因此其执行速度比外部命令快。比如history,cd,exit等等外部命令
是Linux系统中的实用程序部分,因为实用程序的功能通常都比比较强大,所以其中包含的程序里那个也会很大,在系统加载时不会随着系统一起加载进内存中,而是在其需要的时候才调用加载。虽然其不包含在shell中,但是其执行过程是由shell程序控制的。外部命令是在bash之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/bin等等。比如:ls,vi等等
简单来说就是:一个天生自带的天赋技能,一个是后天得来的附加技能。可以使用type命令来区分内建还是外部。
help.man,info命令的使用及区别、
help用于内建命令,help ls 会出现错误,一般外部命令都会有 –help选项
man命令左上角显示”LS(1),在这里,LS表示手册名称,而(1)表示该手册位于第一章节。这个章节用下表说明
章节数 说明 1 Standard commands (标注命令) 2 System calls(系统调用) 3 Libaray functions(库函数) 4 Special devices(设备说明) 5 File formats(文件格式) 6 Games and toys(游戏和娱乐) 7 Miscellaneout(杂项) 8 Administrative Commands(管理员命令) 9 其他(Linux特定的),用来存放内核例行程序的文档 打开手册之后可以通过
pgup
,pgdn
或者上下键来翻看,q
表示退出- info命令来自自由软件基金会的GUN项目,是一个超文本帮助系统,可以显示很多信息。info和man像是两个集合,有交集,但是info显示的更多
Reference #