变量: 全局变量 ---- 环境变量
局部变量 ----本地变量
变量名 = 变量值 VAR = 10
对比:
$变量名 : 取变量的值
${变量名} : 取变量的值(更安全)
$(命令):取命令执行结果
$((变量名)) :对变量执行算术运算
$[变量名] : 对变量执行算术运算
导出:export
export 功能说明:设置或显示环境变量。
语 法:export [-fnp][变量名称]=[变量设置值]
补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅限于该次登陆操作。
参 数:
-f 代表[变量名称]中为函数名称。
-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有的shell赋予程序的环境变量。
删除:unset
* ? [0123456789] [0-9]
命令代换:$()==` ` VAR=`date`
算数代换:$(( ))==$[ ]
转义字符:\ 转特殊意,转本身意
-- 例如创建文件名为 --abc的文件 touch -- --abc
单引号:括字符串不能展开变量
双引号:括字符串可以展开变量
例如:var='date'
echo '$var' 会输出$var 而echo "$var"会输出当前日期
反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。
反引号是一个老的用法,$()才是新的用法
控制语句
条件判别表达式:真:0 假 :1
test 测试条件
[ 空格 测试条件]
例如:
var=10
test $var -gt 100 或者 [ $var -gt 100 ]
echo $?
输出 1
文件类别判别符:
-d 目录文件
-f 普通文件
-p 管道
-l 软连接
-c 字符设备
-b 块设备
-s socket
字符长度判断:
-z 空字符串(长度0)
-n 非空字符串
字符串判等: = 相等 !=不等
逻辑运算: a 相当于&& 逻辑与
o 相当于|| 逻辑或
! 逻辑非
if 判断条件
if [判断条件];then
执行内容
elif [判断条件];then
执行内容
else
执行内容
fi
case分支语句
for循环
while循环
位置参数和特殊变量
重定向
函数
函数名(){
函数体
}
函数传参: 函数名 参数1 参数2 ......
函数外 :$0 -----命令行参数的 argv[0]
$1-$N 命令行参数的 argv[1-N]
函数内 :$0 -----命令行参数的 argv[0]
$1-$N 函数的参数[1-N]
#! /bin/bash
f1(){
echo $0
echo $1
echo $2
echo $3
}
echo $0
echo $1
echo $2
echo $3
echo "---start---"
f1 11 22 33
echo "---end----"
Shell调试命令
正则表达式
字符类使用的符号:
. 匹配一个字符
* 匹配多个字符
[] 匹配指定范围字符
- 在[]内,设定范围
^ 在[]内,匹配除该符号后的其他字符
数量限定符
位置限定符
basic正则和extend正则
baseic正则中字符?+{}|()等应解释为普通字符,要表示上述含义需加\转义;
egrep '正则表达式' xxx = grep -E ‘正则表达式’ xxx =grep '含\转义的正则表达式' xxx
grep 找文本 -r 递归
find 找文件
-name find / -name "init"
-size find / -size +3M -size -7M
-type -d/-f/-p/-l/-s/-c/-b
-maxdepth find / -maxdepth 1 -type d (目录层级)
-exec find ./ -maxdepth 1 -type d -exec ls -ld {}\; (find不能直接用管道|)
-ok find ./ -maxdepth 1 -type d -ok rm -rf {}\; 交互版的 -exec
-xargs find ./ -maxdepth 1 -type f | xargs ls -ld
-print touch test\ test.c 生成 "test test.c"
find ./ -maxdepth 1 -type f -print0 | xargs -0 ls -ld
-atime|ctime|mtime:天为单位
a:访问 c:内容修改 m:属性修改
-amin|cmin|mmin:分钟为单位
find ./ -name "syslog*" -mtime +5 -exec ls -l {} \; (+5五天以外 -5五天以内)
有时对于没有查询权限的目录会出现Permission denied ,有一大坨, 不容易看到正确的查询结果, Permission denied 属于错误,将错误重定向走即可:
find [path] -name "pattern " 2>/dev/null
sed常用命令(-i表示对源文件操作,否则对缓存操作)
删除包含test的行
sed -i '/test/d' etc/test
替换hehe为haha
sed -i 's/hehe/haha/g' tmp.txt
sed -i '1,10s/hehe/haha/g' tmp.txt 1到10行替换
将含有xhn的行中的str1替换为str2
sed -i '/xhn/s/hehe/haha/g' tmp.txt
将<html><head><body>Hello World ! </body></head></html>标签去掉
sed 's/<[^>]*>//g' html.txt
在第二行添加haha,最后的\n是换行符
sed -i "2 a haha\n" tmp.txt
打印用户账号列表
sudo awk 'BEGIN {FS=":"} {print $1}' /etc/passwd
统计文件空行数
awk '/^ *$/ {x=x+1} END {print x;}' testfile