shell是一个用C语言编写的程序,它被称为用户使用linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script),是一种为shell编写的脚本程序。不能进行分布式的计算
helloword实例
#vi/home/shell/first.sh
#!bin/bash
echo "helloword"
#!/bin/bash是一种约定的标记,它告诉系统该脚本用什么解释器,即是哪一类脚本
除了第一行的#不是注释外 都是表示注释
###
linux中的时间:
正号: 以后 负号:以前
`date -d '-x hours' +"%Y-%m-%d %H:%M:%S"`
date -d "-x days" +%Y-%m-%d
date -d "-x weeks" +%Y-%m-%d
date -d "-x months" +%Y-%m-%d
date -d "-x years" +%Y-%m-%d
2. 运行方式
a.可执行权限运行
chmod a+x filename #使脚本具有执行的权限
filename #执行脚本
b.加解释器运行
/bin/bash /home/shell/filename
不用赋予脚本执行权限也不用脚本第一行加#!bin/bash ,加了也是外面的生效
sh fielname 不需要授予执行权限
3.shell变量
首字母必须是字母或下划线,中间不能有空格标点符号(下划线除外)以及bash里的关键字
变量赋值:
name="name" 显式直接赋值
name='expr 2 + 2' 表达式计算结果赋值 注意+号左右都有空格
变量取值
$name ${name}
只读变量
readonly name
删除变量
unset name
变量类型
局部变量: 在脚本或者命令中定义,仅在当前的shell中有效
环境变量:所有程序都能访问
shell变量:shell程序设定的特殊的便利,可以是局部变量也可以是环境变量
字符串
可以用双引号也可以用单引号也可以不用引号
单引号:原样输出,单引号内不能出现单引号
双引号:内部可以使用变量,也可以用转义符
字符串长度:${#string}
提取子字符串:${string:a:b} 从第a个开始截取b个字符
查找子字符串:`expr index "$string" is`
查找字符
"i
或
s"
的位置,输出的是第一次出现i的位置
数组
shell仅支持一维数组
定义:
数组名=(值1 值2... 值n)
或者 数组名=(
值1
值2
.
.
.
值n
)
或者 数组名[i]=值i
读取数组:${数组名[下标]} @和*可以获取所有元素 无数组下标越界异常
获取数组长度:${#数组名[@或*]}
获取单个元素的长度 ${#数组名[n]}
4.shell注释
以#开头表示注释 第一行除外 没有多行注释 非要多行注释可以使用函数包起来
5.shell基本运算符
expr是一款表达式计算工具,使用它能完成表达式的求值操作
注意当用中括号[[]]包含时可使用< > <= >= && ||等运算符
算术运算符 + - * / % == !=
注意: 运算符前后都要加空格
乘法要使用转义符\
前面要加expr
整体要用反引号包括
条件表达式要放在方括号[]里面并且要有空格
关系运算符 -eq 等于 -ne 不等 -lt 小于 -gt大于 -le 小于等于 -ge大于等于
注意运算时要用[]包含
逻辑运算符 !非 -o 或 -a与
字符串运算符 =等于 !=不等于
-z 字符串长度为0 返回true
-n 字符串长度不为0 返回true
str 字符串不为空 返回true
文件测试运算符
-d fiel 是目录为true
-f file 是文件为true
-r file 是否可读
-w file 是否可写
-x file 是否可执行
-s file 是否为空 不为空返回true
-e file 是否已存在
6.条件控制
单一的if:(表达式前必须有空格)
if []
then
cmd1
fi
单一的if else (else后不能有then)
if []
then
cdm1
else
cmd2
fi
if else-if else (elif后必须有then)
if []
then
cdm1
elif []
then
cdm2
else
cmd2
fi
循环 do while until case 支持continue 和 break
for i in 。。。。
do
cmd1
cmd、、
done
while () 表达式用双括号
do
cmd
done
until
case 值 in
模式1)
cmd1
...
模式2)
cmd2.。。
esac
7.方法
格式:
[function] funname(){
方法体
[return]
}
注:可以带function fun()定义,也可以直接fun()
参数返回,可以显示加:return 返回,如果不加将以最后一条命令运行结果返回
return后面跟数值n (0-255)
调用时直接写函数名字不需要()
有参方法调用时可以直接把参数放到函数名后面
需要输入是 用read 变量名 的方法等待输入
函数返回至 直接用 $? 接收
$# 表示传递到脚本的参数个数
8.文件引入
和其他语言一样,shell也可以把汗外部脚本,这样可以方便封装公用的代码作为一个独立的文件
shell语言包含的语法格式如下
. filename 中间有空格
source filename
9.shell简单调试
sh -n file 语法检测
sh -x file 普通调试
中断调试:
在调试过程中按 Ctrl+z中断调试,观察结果,按f+g键继续调试
可以sleep n 方法是程序睡眠
使用调试工具bashdb 可以设置断点 单步执行 变量观察等很多功能
bashdb -c script.sh
bashdb script.sh
bashdb --debugger script.sh 调试命令:
【常用命令】
l 列出当前行上下各5行,总共10行
q|quit 退出
h 帮助
/for/ 向后搜索字符串for
?for? 向前搜索字符串for
x 1+2 计算算术表达式的值
!! ls -laRt 执行shell命令
n 执行下一条语句
s 4 单步执行4次,如遇到函数则进入函数里面
b 4 在行号4处设置断点
del 4 删除行号为4的断点
c 10 一直执行到行号10处
R|run 重新执行当前调试脚本
finish 执行到程序最后
9.其他
linux 时间---------------------
将当前时间格式化:
date +"%Y%m%d" 或者 date +"%Y-%m-%d"
获取当天前后日期:(x为正数即是向前,负数则是向后)
date -d "x days ago" +%Y%m%d
date -d "x weeks ago" +%Y%m%d
date -d "x months ago" +%Y%m%d
date -d "x years ago" +%Y%m%d
crontab -e 定时任务列表编辑
*-------*---------*-------*-----------*
分 时 天 月 周
配置普通用户sudoers
Sudo 使用root权限操作文件
1. 配置文件
该权限
Visudo -f /etc/sudoes
Tom All=(ALL)All