如何提高命令行生产性——第一集
一、bash脚本
- SHELL是什么?
命令行是基于文本的接口,可用于向计算机系统输入指令。Linux命令行由shell提供。多年来已经开发了多种shell程序。Bash是Linux系统中最成功的shell,Bourne Shell(sh)的改进版。
- SHELL脚本是什么?
shell脚本最简单的形式是一个可执行文件,其中包含命令列表,还可以具有编程逻辑以控制整个任务中的决策。
1.1、为什么使用SHELL脚本
许多简单、常见的系统管理任务都是使用命令行工具完成的,而复杂任务通常需要将多个命令链接在一起,以便在它们之间传递结果。使用Bash Shell环境和脚本功能,Linux命令被组合到Shell脚本中,以轻松解决重复和困难的现实问题。
如果编写得当,则Shell脚本本身就是功能强大的命令行工具,并且可以被其他脚本利用。
Shell脚本编写能力对于在任何操作环境中成功进行系统管理都是至关重要的。 Shell脚本的工作知识在企业环境中至关重要,使用脚本可以提高例行任务完成的效率和准确性。
总结来说就是:
- 自动化运维
- 批量化重复操作可以编写脚本结合计划任务自动周期运行
- 减轻管理员工作量
- 提高处理文本文件的速度
- 避免配置出错
1.2、怎么写SHELL脚本
1.创建BASH SHELL 脚本准备
- 熟悉Linux系统管理常见命令
- 熟悉SHELL环境
- 具有一些简单的编程思维
- sed awk命令
- 正则表达式
2.#、\、 “ 、 ’ 用例
许多字符在bash中有特殊的意义,忽略这些含义,使用引号和转义字符。
-
\ ——取消后面单个字符的特殊含义
-
" "—— 压缩shell扩展含义,不压缩命令替换和变量的替换。
-
’ ’ ——可以压缩单引号内部的所有字符含义
-
\符号用例:
echo # not a comment echo \# not a comment echo # not a comment # echo \# not a comment # echo \# not a comment \#
-
""符号和’ '符号用例:
echo "****** hostname is ${HOSTNAME} ******" echo '****** hostname is ${HOSTNAME} ******' echo Your username variable is \$USER echo "Will variable $var evaluate to $(hostname -s)?" echo 'Will variable $var evaluate to $(hostname -s)?' echo \"Hello, world\" echo "# not a comment # echo '# not a comment #
3.编写简单bash脚本
脚本的第一行以’#!'开头,通常称为sh-bang或shebang,这两个字符分别是sharp和bang,表示是一个解释型脚本。 shebang之后跟文件内容解释器。
对于使用Bash脚本语法的脚本文件,shell脚本的第一行如下所示:
#!/bin/bash
示例:
#!/bin/bash
echo -n "hostname is : ";hostname
4.bash脚本执行方法
完成的shell 脚本必须为可执行文件,能作为常规命令运行。使用chmod 命令可添加执行权限,并且可能与 chown 命令组合以更改脚本的文件所有权。仅为脚本的目标用户授予执行权限。
示例:
chmod +x <filename>
/path/filename 或者 ./path/filename
需要cp到$PATH中,只输入filename
bash /path/filename 或者 ./path/filename
如果将脚本放在shell的PATH环境变量中所列的某个目录下,则可以像其他命令那样单独用文件名来调用 shell 脚本。shell 会使用通过该文件名找到的第一个命令;应避免为shell 脚本的文件名使用现有的命令名。或者,您可以通过在命令行上输入脚本的路径名来调用shell 脚本。which 命令,后面跟可执行脚本的文件名,可以显示所要执行的命令的路径名。
示例:
bash /path/filename
二、bash变量
2.1、定义新的变量
变量名=变量值
变量命名:字母、数字和下划线(_),不能以数字开头
-
变量的作用:用来存放系统和用户需要使用的特定参数(值)
-
变量名:使用固定的名称,由系统预设或用户定义
-
变量值:能够根据用户设置、系统环境的变化而变化
示例:
name="zhang san"
echo $name
2.2、变量的分类
-
自定义变量:由用户自己定义、修改和使用
-
环境变量:由系统维护,用于设置工作环境
-
位置变量:通过命令行给脚本程序传递参数
-
预定义变量:Bash中内置的一类变量,不能直接修改
2.3、bash变量生效范围
变量根据生效范围分类:局部变量和全局变量
正常情况:
-
regular变量生效范围:当前shell。
-
ENVIRONMENT变量生效范围:所有shell。
2.4、让变量永久生效
- 登录式shell:/etc/profile、/.bash_profile、/.bashrc、/etc/bashrc
- 非登录式shell: ~/.bashrc、/etc/bashrc
/etc/profile:此文件为系统的每个用户设置环境信息,系统中每个用户登录时都要执行这个脚本,如果系统管理员希望某个设置对所有用户都生效,可以写在这个脚本里,该文件也会/etc/profile.d目录中的配置文件中搜集shell的设置。
~/.bash_profile:每个用户都可使用该文件设置专用于自己的shell信息,当用户登录时,该文件仅执行一次。默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
~/.bashrc:该文件包含专用于自己的shell信息,当登录时以及每次打开新shell时,该文件被读取。
/etc/bashrc:为每一个运行bash shell的用户执行此文件,当bash shell被打开时,
该文件被读取。
2.5、重定向操作
类型 | 操作符 | 用途 |
---|---|---|
定向输入 | < | 从指定的文件读取数据 |
定向输出 | > | 将标准输出结果 保存 到指定的文件,并且覆盖原有内容 |
重定向输出 | >> | 将标准输出结果 追加 到指定的文件的尾部,不覆盖原有内容 |
定向错误输出 | 2> | 将错误信息 保存 到指定的文件,并且覆盖原有内容 |
重定向错误输出 | 2>> | 将错误信息 追加 到指定的文件的尾部,不覆盖原有内容 |
混合输出 | \ &> | 将标准输出、标准错误保存到同一文件中 |
混合输出 | 2>&1 | 将标准错误输出重定向到标准输出 |
2.6、SHELL 特殊变量
$0 命令名或脚本名
$1 第1个参数名
$2 第2个参数名
$3 第3个参数名
.....
$10及之后参数引用需使用{},例如 ${10}
变量 | 含义 |
---|---|
$# | 参数个数 |
$* | 代表所有参数,但是所有参数当作一个整体 |
$@ | 代表所有参数,但是每个参数当作独立的个体 |
$? | 上一个命令的返回值 |
$$ | 当前终端运行的shell PID |
$! | 上一个放在后台执行的命令PID |
!$ | 上一个命令的最后一个参数 |
三、bash算术扩展
3.1、运算符使用
echo $[ EXPRESION ] 或者 expr EXPRESION
bash 不支持浮点运算,如果需要进行浮点运算,需要借助bc,awk 处理。
示例:
echo $[1+1]
echo $[4-2]
echo $[2*2]
echo $[4/2]
echo $[5/2]
echo $[5%2]
expr 5 % 2
expr 5 \* 2
3.2、运算符号
运算符 | 含义 |
---|---|
+ | 一元加法(正号) |
- | 一元减法(负号) |
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 求余 |
** | 求幂 |
++ | 变量后置递增 |
– | 变量后置递减 |
++ | 变量前置递增 |
– | 变量前置递减 |
优先级 | 运算符 | 含义 |
---|---|---|
1 | ++、– | 变量后置递增和递减 |
2 | ++、– | 变量前置递增和递减 |
3 | -、+ | 正负号 |
4 | ** | 求幂 |
5 | *、/、% | 乘法、除法、求余 |
6 | +和- | 加法和减法 |