Shell入门

应用程序通过Shell操作Linux内核
Shell编程语言,命令行解析器中

Centos提供六种Shell解析器,常用的是:sh,bash,默认的解析器是bash

echo:显示文字,输入、输出
Shell脚本
脚本格式以:#!/bin/bash开头(指定解析器)
执行脚本:sh或bash hellworld.sh;
使不依赖sh或bash,配置执行权限 chmod 777 hellworld.sh

Shell脚本:多命令处理
touch banzhang.sh

!#/bin/bash
cd /home/
touch aa.txt
echo "HelloWorld" >> aa.txt

bash banzhang.sh

Shell变量 (变量都是字符串类型,不能直接进行数值运算)
系统变量 (写脚本时方便的获取)
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
程序
done


read读取控制台输入
语法
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

原文地址:https://www.cnblogs.com/Bkxk/p/10131778.html