Shell语言 —— 基础知识
1、脚本俗称:命令的集合
2、管道和重定向:
管道:连接多条命令,前一天命令正确执行的结果,作为后一条命令的输入条件。
重定向:将输出到屏幕中的内容保存放到文件中。
3、交互设备文件:
输出、输入、错误
标准输入设备:键盘(stdin),设备描述符“0”
标准输出设备:显示器(stdout),设备描述符“1”
错误输出设备:显示器(stderr),设备描述符“2”
4、覆盖数据和追加数据:
覆盖输出重定向>:后面的数据会覆盖以前的数据。
追加输出重定向>>:后面的数据会追加到以前的数据末尾。
覆盖错误输出重定向2>:后面的数据会覆盖以前的数据。
1
例:ls /boooooot 2> /q.txt ls 这个booooot这个目录会将报错信息放入q.txt这 个 文件中,因为没有这个booooot这个目录。
追加错误输出重定向2>>:输出的数据会追加到文件的末尾。
覆盖混合输出重定向&>:混合重定向(标准和错误重定向)将标准输出,错误输出到 同一个文件。
追加混合输出重定向&>>:混合重定向(标准和错误重定向)将标准输出,错误输出到同 一个文件。
Linux所支持的shell(shell壳)
默认的shell是bash(Bourne Again shell)
5、脚本执行的方式:
1)路径执行:脚本必须有执行的权限
2).或者source:脚本可以不具备执行权限(使设置的变量立即生效)
3)Shell程序执行:必须是系统所安装的shell,脚本可以不具备执行权限
6、Shell脚本格式:
1 | #!/bin/bash (名:shebang,必须在脚本的第一行,指定脚本的执行程序) |
例:
1 | #!/bin/bash |
7、变量:
1)局部变量:只对当前的shell 生效
2)全局变量:对所有shell都生效 (export 变量名)
3)用户变量:只对某个用户生效,配置文件宿主目录下.bash_profile和.bashrc
4)系统变量:对所有用户都生效,配置文件/etc/profile和/etc/bashrc
5)自定义变量:用户自己定的变量
6)预定义变量:bash中内置的一类变量,不能直接修改
A)预定义变量类型:
$#:位置变量个数
$*:位置变量内容
$?:返回上一条命令执行结果状态码(0是正确,1-255代表错误)
$0:命令字
8、特殊的shell变量:
1)环境变量
系统执行用户命令时,若用户未给出绝对路径,则首先在当前目录下寻找相应的可执行文件、批处理文件(另外一种可以执行的文件)等。若找不到,再依次在PATH保存的这些路径中寻找相应的可执行的程序文件。系统就以第一次找到的为准。
(举个例子当操作员运行mysql命令:也就是说在一个程序不做环境变量和软链接时,输入这条命令就会提示未找到命令,这个未找到命令就是系统找不到咱们这个程序,这时就用到了咱们这个环境变量或者软链接,做环境变量的意义就是为咱们这个操作系统系统程序的工作路径方便操作系统去寻找程序,这时咱们设置环境变量的时候PATH就要指定该程序的绝对路径,然后再运行程序的时候就可以顺利的进行了)
声明变量:[varname变量名]=[varvalues变量值]
查看变量:echo $varname变量名
转换局部为全局变量:
1 | 1)export a=4 |
变量赋值的特殊操作之引号
双引“”:可以显示变量
单引‘’:强引用,引用普通字符
反撇号`:引用命令执行结果
read:交互中,提示用户输入信息
\转移符:把一些特殊的字符转化成为自己本身代表的字符,正则表达式中多用。
9、变量赋值的特殊操作:
在等号=后边直接指定变量内容时为变量赋值的最基本方法,除此之外,还有一些特殊 的赋值的操作。
1)双引号“”
如果其定义变量的时候使用双引号的话,则里面的变量或者函数会通过解析,解析完成后再输出内容,而不是把双引号中的变量名以及命令原样子输出。
特别的是当要赋值的内容中包含空格时,必须以引号括起来,其他情况下可以省略。
1 | # a=zx o |
这就是在赋值的时候值有空格,执行后报错(加上引号才可以执行)
1 | # you="zx" |
输出变量中的内容时必须加“引号” ””,在引号内使用“$”符号就是引用其他变量的值(变量引用)从而能够直接调用现有变量的值来赋给新的变量,意思就是先将引号中的变量进行解析,成功解析后在用echo命令输出。
2)单引号(’’):
当要赋值的内容中包含$、”、\ 等具有特殊含义的字符时,应使用单引号括起来, 在单引号的范围内将无法引用其他的变量,任何字符就会作为普通的字符看待,但 是赋值内容包含单引号时需使用 \ 符号进行转义,以免冲突。
意思就是单引号中的值都是会直接输出字符或这字符串的字面量,不会去解析各种变量或者其他的符号,而且必须是成对出现的。
1 | # b='my is $a' //这里的$符号不再引用变量 |
3)反撇号(`):同等与$( )
反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量,反撇号括起来的范围内必须是能够执行的命令行,否则将会出错。
1 | [root@ansible-server ~]# ls -lh `which useradd` |
注意:使用反撇号难以在同一行命令中实现嵌套命令替换操作这时就可以用“$( )”来代替反撇号的操作(从里到外依次执行替换)。
例:查看useradd的安装包的文件位置在哪。
1 | [root@ansible-server ~]# rpm -qc $(rpm -qf `which useradd`) |
4)read命令:
Read命令用来提示用户输入信息,从而实现简单的交互过程。
选项:
-p:指定要显示信息的提示
-s:静默输入,一般用于密码
-n #:指定输入的字符长度最大值#
-d ’字符’:输入结束符,当你输入的内容出现这个字符时,立即结束输入
-t N:超出N秒没有进行输入,则自动退出。
执行read命令后,进入输数据的时刻输完回车,这时输入后的值成为变量值。
1 | [root@ansible-server ~]# read zx |
5)设置变量的作用范围:
默认情况下,新定义的变量只在当前的shell环境中生效,因此称为局部变量,当进入子程序或新的子shell环境中,局部变量无法生效。例:
1 | [root@ansible-server ~]# echo $zx |
