一、Shell的基础概念
shell 简介:
shell的家族有好多成员,sh是最古老的shell,
bash是目前最流行的shell。
shell 对于运维人员的重要性:
如果让一个linux运维工程师去机房管理上百台机器,
就必须使用到自动化技术(通常是用Python或Shell),
Python相对而言比bash脚本要庞大一些,
并且bash脚本更加底层,在获取机器硬件配置方面更是有优势。
几种常用的shell:
sh:最古老的前辈,现在功能不够强大。
csh:接近c语法的shell,不够流行。
bash:最流行的shell,功能强大。
ash:比较省资源的shell,但是不流行。
shell脚本的用途有:
自动化运维常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或文件
如何进入shell:
现在发行版本的linux一般都带有gui界面,
可以在gui界面中通过terminal程序来模拟shell环境,
或者(ctrl+alt)+F2-F6来切换到console模式,
(ctrl+alt)+F1可以切换回GUI模式。
Shell编程的特点:
Shell编程是过程式、解释执行。
本文将如何介绍Shell基础?
本文已假定你们已熟练C语言的基本语法,
并且假定熟练基本的shutdown、ifconfig等常见命令。
需要学习Linux文本处理工具可参考博文:cnblogs.com/kading/p/10923025.html
二、Shell基础格式和名词概念
Shell编程语言的基本结构:
各种系统命令的组合
数据存储:变量、数组
表达式:a + b
语句:if,while,for
shell 提示符:
例如:[root@localhost ~]#reboot
上面这一句包括了5个信息,
当前登录用户为root,
当前主机为localhost,
当前所在目录为/root,
root为管理员身份,
将要执行reboot操作。
shell的提示符是指除reboot的部分,
提示符特指例子中的[root@localhost ~]#,这一部分。
提示符的格式为,当前登录用户@当前主机 $代表普通用户,#代表管理员。
创建shell脚本 以及运行
第一步:创建然后用vi或gedit等工具来编辑。
第一行必须包括shell声明序列:#!
示例:#!/bin/bash
第二步:规范脚本,你需要添加脚本的注释,作者信息,程序版本号等内容。
注释以#开头,脚本出问题时非常管用。
第三步:运行脚本
给予执行权限,然后执行。
创建第一个shell脚本:
>>>
#!/bin/bash
# Author : Steven KE
echo "What is your name?"
read PERSON
echo "Hello, $PERSON"
<<<
脚本的头部: #!/bin/bash
这个头部告诉linux系统,使用哪个解释器解释这段文本。
有个这个头部,Linux就会使用/bin/bash去解释下面的语句。
echo "", $后面接变量名,如$PERSON, 建议变量名使用全大写表示。
还有就是,与c语言不同的语法,
等号前后不能有空格,加号前后必须有空格,这些细节后面还会反复强调。
三、Shell中使用的变量
Shell中会使用到局部变量、环境变量、Shell变量
变量类型:
局部变量,环境变量,Shell变量
特别说一下Shell变量,Shell变量里包含着局部变量,
Shell变量还包含着某些环境变量,你可把这部环境变量理解为全局变量。
局部变量:
定义变量
建议数字直接赋给变量,需要原样输出的用单引号,其余均用双引号。
使用变量,变量赋值。
默认所有变量即使是数字赋值,也会作为字符串来处理。
如果需要特别强调该变量是数字类型,可用declare,
这点与其他脚本语言有区别。
变量引用,修改变量的值
可以直接给变量赋值,改变该变量的内容。
删除变量的值
unset语法用来删除变量,unset abc,删除abc这个变量。
单引号和双引号的区别
单引号,表示强引用,而保持原字符串输出。
单引号表示原样输出,即使遇到$变量,也原样输出。
双引号,表示弱引用,其中的变量引用会被替换为变量值。
命令引用即得到命令结果再赋值
建议用abc = $(command), 不推荐用 abc=`command` 这种语法。
只读变量用法
readonly abc 表示abc这个变量是只读的,这意味着修改或删除都会报错。
显示已定义的所有变量:set
删除变量:unset name
环境变量:
变量声明、赋值: export name=VALUE 或者 declare -x name=VALUE
显示所有环境变量:
env 或者 printenv 或者 export declare -x
Bash内建的环境变量有:
PATH SHELL USER UID
HOME PWD HOSTNAME
_下划线
所有变量中按不同的分类标准继续分:
特殊变量:
$0,$n,$#,$*,$@,$?,$$的含义
$0表示当前脚本的名字
$1,$2,$n等,表示第n个参数的名字
$# 表示参数的数量
$*、$@ 表示所有参数 , 后者更强调参数分开表示
注意:$@ $* 只在被双引号包起来的时候才会有差异,
当他们被双引号包起来时,后者会把每个成员用双引号包住。
$? 表示上一次执行脚本成功的情况。 通常0代表成功。
$$ 表示当前脚本的进程PIN值
set -- 清空所有位置变量
退出状态$? :
注意:脚本中一旦遇到exit命令,脚本会立即终止;
终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,特指最后一条命令的状态码。
通常0代表成功,1代表失败。
只读变量:
声明只读变量:readonly name 或 declare -r name
查看只读变量: readonly -p
Shell 字符串:
字符串长度获取用${#variable}
提取子字符串用${variable:0:4}
查找子字符串用 `expr index $varibale is` 这部分内容需要细化讲。
Shell 数组:
定义数组,array=(a b c d)
读取数组,${array[0]}
获取数组的长度,${#array[@]} , 或者 ${#array[*]},或者 ${#array[n]}
四、Shell中使用的运算符和基础语法
Shell 运算符:
Shell算术运算符
+, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义。
随机数变量:$RANDOM(0-32767)
例如:echo $[$RANDOM%50] 表示生成 0 - 49 之间随机数
Shell本身不支持数字运算,他需要借助expr表达式来运算数字。
关系运算符
-gt 表示大于, -eq表示等于, -ne表示不等于。
布尔运算符
被关系运算符包含的概念
算数运算:
Bash不支持算术运算,需要借助expr实现。
例如: var=$(expr arg1 arg2 arg3 ...)
算术赋值:
增强型赋值:
+=, -=, *=, /=, %=
let varOPERvalue
例如:let count+=3
自加3后自赋值
逻辑运算(C语言中 &、| )(与、或、非)
短路运算(C语言中 &&、|| )(短路与、短路或、异或^)
异或:^
异或的两个值,相同为假,不同为真
Shell 注释
单行注释用 #
多行注释没有,可以考虑用{}定义为一个函数,但是不调用。
命令行参数
命令行参数个数用$#, 具体地第一个参数$1,第n个参数$n
Shell字符串输出转义
-e、-n
默认字符串里的\n会原样输出 ,在echo时指定 -e,表示转义后输出。
-n表示 只对字符串里面的\n 进行转义,其他的按默认转义设定来输出。
比较灵活的语句:
${var:=word},若var为空,则给var赋值,表达式返回word。
${var:+word},若var不为空,则表达式返回word。
Shell echo 命令
显示转义字符
echo -e "\"nice\""
显示变量
echo ${variable}
显示换行
echo -e "this is a test\n"
echo "this is a test"
显示不换行
echo -e "this is a test\c"
echo "this is a test"
显示结果重定向到文件中
echo "a test string" > file.txt
原样输出字符串
echo '$yourStringWillNotWork'
显示命令输出
echo `command` 或者 echo $(command)
为了便于阅读,实际编写时建议用 $(command)
Shell printf 命令
相比c语言的printf
有四点需要注意的
1.不需要括号
2.format格式化部分不需要引号
3.format格式化部分不需要重复写,会自动复用。
4.参数用空格分割而不是逗号。
相比echo
echo会自动换行,printf不会自动换行,要手动加\n完成换行。
五、高级运算符(测试运算符)
字符串运算符
字符串长度是否为0,两字符串是否相同的比较,运算结果只能是bool类型。
文件测试运算符
-r -w -x -e -d -s 后面接 文件名。-s表示文件大小是否为零。
举例: if [ -r $filename ] ,结果只能是bool类型。
//TODO
六、初级语句,read,if case
//TODO