应用程序通过Shell操作Linux内核
Shell编程语言,命令行解析器中Centos提供六种Shell解析器,常用的是:sh,bash,默认的解析器是bash
echo:显示文字,输入、输出
Shell脚本 脚本格式以:#!/bin/bash开头(指定解析器) 执行脚本:sh或bash hellworld.sh; 使不依赖sh或bash,配置执行权限 chmod 777 hellworld.shShell脚本:多命令处理 touch banzhang.sh !#/bin/bash cd /home/ touch aa.txt echo "HelloWorld" >> aa.txt bash banzhang.shShell变量 (变量都是字符串类型,不能直接进行数值运算) 系统变量 (写脚本时方便的获取) echo $HOME echo $PWD echo $SHELL echo $USER 自定义变量 定义变量:变量=值 A=1 A="wang zhang liu" echo $A 撤销变量:unset A 静态变量:readonly B=2 把变量提升为全局变量:export A (日后应用场景:$Hadoop_HOME/$kafka_HOME/$Spack_HOME) 特殊变量 $n: echo "$0 $1 $2" (0是脚本本身,1 2是参数) $#: echo $# (获取脚本传参的个数,一般用循环) $*、$@ (变量代表命令行所有参数) $? (最后一次执行的命令的返回状态,命令正确执行变量为0,否则命令执行不正确)运算符
$[运算式] A=$[(2+2)*4] expr +,-,\*,/,% (加,减,乘,除,取于) 注:expr运算符间要有空格条件判断
[ condition ] 注:condition前后要有空格,条件非空就是true,是空就是false 字符串比较: -lt小于 -le小于等于 -eq等于 -ne不等于 -gt大于 -ge大于等于 文件权限判断: -r有读权限 -w有写权限 -x有执行权限 文件类型判断: -f文件存在并是一个常规的文件 -e文件存在 -d文件存在并是一个目录流程控制
if判断 语法: if [ $1 -eq "1" ];then echo "banzhang zhenshuai" elif [ $1 -eq "2" ] then echo "cls zhen mei" fi 注意事项:中括号和条件判断式之间必须有空格 if后要有空格case语法
case $1 in "1") echo "banzhang" ;; "2") echo "cls" ;; *) echo "shuaige" ;; esac 2)双分号“;;”表示命令序列结束,相当于java中的break。 3)最后的“*)”表示默认模式,相当于java中的default。for循环 语法1 for((初始值;循环控制条件;变量变化)) do 程序 done 案例实操 s=0 for((i=0;i<=100;i++)) do s=$[$s+$i] done echo $s 语法2 for 变量 in 值1 值2 值3 do 程序 done 案例实操 for i in $* do echo "banzhang love $i" done for i in "$*" do echo "banzhang love $i" done 比较$*和$@区别: 当它们被双引号“”包含时, “$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数; “$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。while循环 while[ 条件判断式 ] do 程序 doneread读取控制台输入 语法 read(选项)(参数) 选项 -p:指定读取值时的提示符 -t:指定读取值等待的事件(秒) 参数 变量:指定读取值的变量名 案例实操 read -t 7 -p "Enter your name in 7 seconds" NAME echo $NAME函数
系统函数语法 basename[string/pathname][suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。 选项: 如果suffix被指定了,basename会将pathname或string中的suffix去掉。 案例实操 截取该/home/atguigu/banzhang.txt路径的文件名称 basename /home/atguigu/banzhang.txt basename /home/atguigu/banzhang.txt .txt dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)) 案例实操 截取该/home/atguigu/banzhang.txt文件名称的整个路径 dirname /home/atguigu/banzhang.txt 自定义函数语法 [function] funname[()] { Action; [return int;] } funname 2.经验技巧 (1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。 (2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255) 案例实操 function sum() { s=0 s=$[$1 + $2] echo "$s" } read -p "Please input the number1:" n1; read -p "Please input the number2:" n2; sum $n1 $n2;Shell工具(重点)
cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。 语法: cut[选项参数] filename 说明:默认分隔符是制表符 选项参数 -f:列号,提取第几列 -d: 分隔符, 按照指定分隔符分割列 案例实操 cut -d " " -f 2,3 cut.txt (切割cut.txt第二、三列) cat cut.txt | grep "guan" | cut -d " " -f 1 (在cut.txt文件中切割出guan) 过滤 sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。 语法: sed[选项参数] 'command' filename 选项参数 -e: 直接在指令列模式上进行sed的动作编辑 命令功能 -a:新增,a的后面可以接字串,在下一行出现 -d: 删除 -s: 查找并替换 案例实操 sed '2a mei nv' sed.txt (将“mei nv”这个单词插入到sed.txt第二行下) 注意:文件并没有改变 sed '/wo/d' sed.txt (删除sed.txt文件所有包含wo的行) sed 's/wo/in/g' sed.txt (将sed.txt文件中wo替换为ni) 注意:‘g’表示global,全部替换 awk一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。 语法: awk[选项参数] 'pattern1{action1} pattern2{action2}' filename 注意:只有匹配了pattern的行才会执行action pattern:表示awk在文件的数据中查找的内容,匹配模式 action: 所执行的一系列命令 选项参数 -F 指定输入文件拆分隔符 -v 赋值一个用户定义变量 案例实操 awk -F: '/^root/{print $7}' passwd (搜索passwd文件以root关键字开头的所有行,并输出该行的第7列) awk -F: '/^root/{print $1","$7}' password (搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割。) awk -F: 'BEGIN{print "user,shell"}{print $1","$7} END{print "kaige,/bin/zuishuai"}' passwd 注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。 awk -v i=1 -F: '{print $3+i}' passwd (将passwd文件中的用户id增加数值1并输出) awk的内置变量 FILENAME:文件名 NR:已读的记录数 NF:浏览记录的域的个数 (切割后,列的个数) 案例实操 awk -F: '{print"filename:" FILENAME",linenumber:" NR",columns:" NF}' passwd (统计passwd文件名,每行的行号,每行的列数) ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}' (切割IP) awk '/^$/{print NR}' sed.txt (查询sed.txt中空行所在的行号) sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。 sort(选项)(参数) 选项: -n 从小到大 -r 从大到小 -t 排序时所用的分割字符 -k 指定需要排序的列 参数: 指定待排序的文件列表 案例实操 sort -t : -nrk 3 sort.sh企业真实面试题京东 问题1:使用Linux命令查询file1中空行所在的行号 awk '/^$/{print NR}' sed.txt 有文件chengji.txt内容如下: 张三 40 李四 50 王五 60 问题2:使用Linux命令计算第二列的和并输出 cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}' 搜狐和讯网 问题1:Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理? if [ -f file.txt ]; then echo "文件存在!" else echo "文件不存在!" fi新浪 问题1:用shell写一个脚本,对文本中无序的一列数字排序 sort -n test.txt|awk '{a+=$0;print $0}END{print "SUM="a}金和网络 问题1:请用shell脚本写出查找当前文件夹(/home)下所有的文本文件内容中包含有字符”shen”的文件名称 grep -r "shen" /home | cut -d ":" -f 1