######################Linux-shell############################
echo string
用于字符串的输出
ls [-alrtAFR] [name...]
显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。
sudo
以系统管理者的身份执行指令
vi/vim
编辑器,进入后按o进行编辑
编辑结束,先按esc键,退出插入模式,然后按住shift键,并连按两次z字符,即可保存刚才的编辑并退出vim编辑状态
若是切换到命令行模式,按下esc,然后:开头
1.保存不退出:
:w 保存文件但不退出vi 编辑
:w! 强制保存,不退出vi 编辑
:w file 将修改另存到file中,不退出vi 编辑
2.保存并退出:
:wq 保存文件并退出vi 编辑
:wq! 强制保存文件并退出vi 编辑
3.不保存并退出:
q: 不保存文件并退出vi 编辑
:q! 不保存文件并强制退出vi 编辑
:e! 放弃所有修改,从上次保存文件开始在编辑
source 文件/. 文件
让当前脚本生效(修改后)
grep
用于查找文件里符合条件的字符串
chmod
赋予用户文件的读写执行权限
执行shell脚本(先要获取权限 chmod 777 文件名)
1.当前目录下运行
执行 ./test.sh
2.绝对路径运行
执行 /home/***/test.sh
3.当前目录下运行
sh test.sh
4.当前目录
source/. tesh.sh
5.当前目录
/bin/bash test.sh
显示当前用户的环境变量
env
定义、新增/修改/删除环境变量
export VAR=10
unset VAR
搜索查找环境变量中含有该变量名的字段
env | grep 变量名
搜索查找环境变量中含有该变量名的值的字段
env | grep $变量名
复制上一级文件夹的文件到当前目录
cp ../文件名 .
/ 根目录
~ 家目录,用户的个人目录
./ 当前目录
../上级目录
exit 1 正常退出
exit 0 非正常退出
read file_name 从输入中读取一行,指定给file_name变量
cat
cat主要有三大功能:
1.一次显示整个文件。
2.从键盘创建一个文件。
$ cat > filename
然后输入文本内容,退出可Ctrl+D
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件。
$cat file1 file2 > file
more
Linux的more命令类似 cat命令 ,不过more命令以一页一页的形式显示,更方便使用者逐页阅读。
按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,输入/+字符串可以搜索字符串(与vi搜索类似)。
egrep '正则表达式' 文件名
会匹配文件名内容中符合正则的内容
find命令 不能和管道结合使用
find 目录 选项 参数 默认递归搜索
-type
find ./ -type f 搜索当前目录下的文件
-size
find ./ -size +20k -size -5M 搜索当前目录下文件或文件夹大小在20k到5M之间的
-name
find ./ -name "a" 寻找名为a的文件或者文件夹
-maxdepth
find ./ -maxdepth 2 -type f 搜索当前目录下的文件,递归到第二级子目录
-exec
find ./ -size +20k -size -5M -exec ls -l {} \; 对搜索的结果执行ls -l -exec执行命令 \;表示转义
-ok
find ./ -size +20k -size -5M -ok rm -rf {} \; 会挨个儿先询问你是否删除,y表示删除,n表示不删除 -ok交互版的-exec
| xargs
find ./ -maxdepth 1 -type d | xargs ls -ldh 对find的结果进行分批处理,防止find的结果太大,内存溢出。以空格分批
| xargs有个弊端,默认以空格对搜索结果进行分批,而linux可以创建名称带有空格的文件
可以指定| xargs 的分割标记,并在每个搜索结果的末尾加上标记
find ./ -type f -print0 | xargs -0 ls -lh
ls -ld 文件夹名 列出当前目录下指定文件夹信息
ls -ldh 文件夹名 列出当前目录下指定文件夹信息,包括大小
**************************************************************************************************
shell 语法
数据类型:String,只有一种,所以定义时可不写
变量:全局变量----环境变量 定义export VAR=10
局部变量----本地变量 定义VAR=10
VAR=10 无空格,不然会报错,一般大写
$变量名:取变量的值
${变量名}: 取变量的值(更安全)
$(命令):取命令执行结果 例如$(date) 相当于`date` (esc下面的那个键,反引号)
$(())/$[]算数计算
VAR=10
$((VAR+5))=$[VAR+5]=$((${VAR}+5))
2#10 2进制的10 2
8#10 8进制的10 8
转义字符 \ --
续航符 \
单引号和双引号:括字符串,双引号可以将变量展开,单引号不能
echo '$VAR' 输出$VAR
echo "$VAR" 输出VAR的值
控制语句:
执行命令 test或者[空格 条件 ]
条件判别表达式:真返回0 假返回1
$? 上一条命令的执行结果
例如: test ${VAR} -gt 100 [ ${VAR} -gt 100 ] [为条件测试命令,后面有空格 不要理解为一对中括号
echo $?
整数判别符(只能用在整数之间):-eq等于 -ne不等于 -lt小于 -gt大于 -le小于等于 -ge大于等于
文件类型判别符:
[ -d dir ] 判断是否是目录 [ ! -d dir ]取反
[ -f file] 判断是否是文件
[ -p string] 管道
[ -l string] 软连接
[ -c string] 字符设备
[ -b string] 块设备
[ -s string] socket
字符串长度判断:
[ -z string] 不存在或者为空
[ -n string] 长度不为0
字符串判等:
=
!=
逻辑运算:
-a 逻辑与
-o 逻辑或
! 逻辑非
[ -d desktop -a "$VAR"="sjl"] 最好在$VAR上加上引号,避免VAR变量不存在
[ -d desktop -a $VAR="sjl"] 不存在时编译为[ -d desktop -a ="sjl"],报错
[ -d desktop -a "$VAR"="sjl"]不存在时编译为[ -d desktop -a ""="sjl"],不报错
通配符:* 0个或多个字符
? 1个字符
[若干字符] 匹配方括号中的任意一个字符
if语句
if [ -f a.txt];then
echo 'it is a file'
fi
ps:then相当于[ fi相当于]
;可省略,但是then要另提一行 ;相当于换行
else语句
#! /bin/sh
echo '请输入文件名'
read file_name
if [ -f "$file_name"];then
echo 'it is a file'
elif [ -d "$file_name" ];then
ehco 'it is a directory'
else
exit 1 (return;)
fi
if :;then echo "hello";fi ;相当于换行 :表示空命令,相当于true
case语句
#! /bin/sh
echo "Are you pig"
read yes_or_no
case "${yes_or_no}" in
yes|Yes|YES|Y|y)
echo "hello!pig!";;
[nN][oO])
echo "I am a cat!";;
*)
echo "I am a mouse!"
return 1;;
esac
for循环,相当于foreach
#! /bin/sh
for FILENAME in `ls d?`;do mv $FILENAME $FILENAME~;done
while循环
#! /bin/sh
echo "请输入密码"
read PWD
while [ "${PWD}" != "sjl" ];do
echo "密码错误,请重新输入"
read PWD
done
while循环2
#! /bin/sh
COUNT=1
while [ $COUNT -lt 5 ];do
echo "gcome on"
COUNT=$(($COUNT+1))
done
break和continue
break 跳出循环,可指定跳出几层循环 break[n]
continue 跳过本次循环
until循环,相当于do...while
shell位置参数和特殊变量
$0 可执行程序名,相当于C语言main函数的argv[0]
$1 $2 $3....位置参数,相当于argv[1],argv[2],argv[3]
$# 相当于argv -1 ,相当于参数个数
$@ 表示参数列表(可以用做for的遍历),从$1开始
$* 表示参数列表
$? 上一条命令的exit status(0为真 非0为假)
$$ 当前进程号
shift 会使参数列表右移
shift 右移一位,$0不变,$2变为$1,$3变为$2...原来的$1丢弃
shift 3 右移三位,$0不变。。。同上
#! /bin/sh
echo "the program $0 is now running"
echo "the first parameter is $1"
echo "the second parameter is $2"
echo "the parameter list is $@"
echo "the parameter list is $*"
shift
echo "the first paraneter is $1"
echo "the second paranter is $2"
echo "the parameter list is $@"
echo "the parameter list is $*"
[root@localhost ~]# . test.sh 11 22 33 44
the program -bash is now running
the first parameter is 11
the second parameter is 22
the parameter list is 11 22 33 44
the parameter list is 11 22 33 44
the first paraneter is 22
the second paranter is 33
the parameter list is 22 33 44
the parameter list is 22 33 44
输出指令
1.printf
printf format-string [arguments...]
参数说明:
format-string: 为格式控制字符串,例如 %s %c %d %f都是格式替代符
arguments: 为参数列表。
示例:
!bin/bash
# "%d %s\n"为format-string参数, 1为%d的参数, abc为%s的参数
printf "%d %s\n" 1 "abc"
输出:
1 abc
2.echo
echo ""
echo -e "" 开启转义
echo -n "" 输出后不换行
echo '' 原样输出
管道
可以通过|将一个命令的输出传递给另一个命令做输入
tee
输出执行结果并存储副本
文件重定向
cmd命令 > file 将输出重定向到文件中,原先文件存在会先删除,创建新文件
cmd命令 >> file 将输出追加到文件中,不存在会创建,存在会追加
Linux标准文件描述符
文件描述符 缩写 描述
0 STDIN 标准输入 <
1 STDOUT 标准输出 >
2 STDERR 标准错误输出 2>
cmd命令 > file 2>&1 将标注错误输出重定向到1(标准输出)所指向的file中 &取地址符
cat a.txt > b.txt 读取a.txt内容输出到b.txt 和 cat < a.txt > b.txt 达到的效果差不多
-----------------------函数-----------------------------------
函数:
无返回值和参数列表
函数名(){
函数体
}
示例1:
#! /bin/sh
foo(){ //左花括号和命令之间必须有空格或者换行
for TEST in $@;do
ls -ld $TEST
done
}
foo $@ //传参
示例2:
f1(){
echo $0
echo $1
echo $2
echo $3
}
echo $0
echo $1
echo $2
echo $3
f1 11 22 33
执行:test.sh aa bb cc
输出:./test.sh
aa
bb
cc
./test.sh
11
22
33
函数内部的$1..表示函数的第1..个参数,$0不变,为可执行程序名
shell脚本调试:
1.使用bash命令参数调试
[root@ks ~]# sh [-nvx] test.sh
参数说明:
-n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示
-v:在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本。如果有错误,也会给出错误提示。
-x:将执行的脚本内容及输出显示到屏幕上,这是对调试很有用的参数。
面向对象:继承、重载、封装、多态
框架:
---------------正则表达式-------------------
数量限定符
. 匹配一个字符
* 匹配多个字符
[] 匹配指定范围的字符
^ 匹配除该符号后面的其他字符 在中括号内使用
? 0或1次
+ 一次或多次
* 0次或多次
{n} 匹配n次
{n,} 匹配至少n次
{,m} 最多匹配m次
{n,m} 匹配n到m次
grep匹配包含某一模式的行,而不是完全匹配
位置限定符
^ 行首的位置
$ 行末的位置
\< 单词开头的位置
\> 单词结尾的位置
特殊字符
\ 转义字符
() 单元符
| 或符,连接表达式
grep 文本搜索工具
(Basic正则)和egrep(Extended正则)
用grep需要对正则中的一些符号进行转义,如?+{}|(),比较麻烦
grep '^[0-9]\{1,3\}$'
可用扩展正则
egrep '^[0-9]{1,3}$'
如果系统不支持egrep命令,可替换为grep -E '^[0-9]{1,3}$'
sed 在线编辑器,处理文件的行数据
它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),
接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
https://www.cnblogs.com/ginvip/p/6376049.html
https://www.linuxprobe.com/linux-sed-command.html
awk 处理文本文件的一个应用程序,文本分析工具,处理文件的列数据
它依次处理文件的每一行,并读取里面的每一个字段