Shell && Linux学习笔记

注意:该文章摘抄之百度,仅当做学习笔记供小白使用,若侵权请联系删除!


目录

什么是shell ?

Linux正则匹配

grep

tar与unzip

echo

history

重定向

shell 单双引号

位置参数

预定义变量

运算

正则表达式

字符截取命令

awk 命令

seq 命令

整数比较

多重条件判断

if 判断

case 判断

for 循环

while 循环

until 循环


什么是shell ?

定义:shell是一个命令行解释器,为用户提供一个向linux 内核发送请求以便远程程序的界面系统级程序,用户可以用shell来启动、挂起、停止及编写程序

Linux正则匹配

正则表达式又称为正规表达式、常规表达式、在代码中常简写为regex、regex或RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定的字符串。

shell三剑客:grep,sed,awk

grep
grep [选项]  [查找条件(正则)]  [目标文件]
 
-E:开启扩展的正则表达式
-c:计算找到'搜寻字符串'的次数
-i:忽略大小写的不同,所以大小写视为相同
-o:只显示被漠视匹配到的字符串
-v:反向选择,即输出没有匹配到的那些字符
--color=auto:可以将找到的关键词部分加上颜色的显示!
-n:顺便输出行号
-w:表示精确匹配一个字符

 元字符

^    匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配"^"字符本身,需要转移"^"
$    匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则"$"也匹配'\n'或'r'
.    “.”代表除"\n\s"之外的任何单个字符
\    反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的 特殊意义
匹配前面的子表达式零次或多次。要匹配"*"字符,要进行\转移
n和m均为非负整数,其中n<=m,最少匹配n次,最多匹配m次

 grep查找特定的字符

grep -n 'the' test.txt 

grep -vn 'the' test.txt  #匹配除了包含the的行

使用[]来查找集合字符

eg: 要查找short和shirt时

比如我们要查找“shirt”与“short”这两个字符串时,可以发现这两个字符串均包含sh与rt。 此时执行下面命令可以提示查找到“shirt”和“short”这两个字符串,其中“[]”无论有几个字符,都代表一个字符, 但是会按照[]内的每个字符都去做一次匹配,比如[io]表示要匹配i或者o。 grep -n "sh[io]rt" test.txt

查找oo前面不是w的字符串

若查找“oo”前面不是“w”的字符串,只需要通过集合字符的反向选择“[A]”来实现该目的。 例如执行“grep -n‘[^w]oo’test.txt”命令表示在 test.txt 文本中查找“oo”前面不是“w”的字符串。 grep -n '[^w]oo' test.txt

tar与unzip

tar

-f<备份文件>或--file=<备份文件> 指定备份文件。

-v或--verbose 显示指令执行过程。

-x或--extract或--get 从备份文件中还原文件。

-z或--gzip或--ungzip 通过gzip指令处理备份文件。

unzip

-l 显示压缩文件内所包含的文件。

-v 执行时显示详细的信息。

echo
echo [param] [content]
-e  # 开启转义,对反斜杠控制的字符转换
echo -e '\n'  # 显示换行
echo `date` # 显示命令执行的结果
history
history [param][file]
-c  # 清空历史命令
-w  # 写入文件
历史命令的调用:
!n   # 重复执行第n条历史命令
!!  # 重复执行上一条命令
!字符串 # 重复执行最后一条以该字符串开头的命令
  • Bash快捷键
  • crtl+A 转前 crtl+E 转后 crtl+R 搜索历史命令 crtl+Z 放到后台运行
  • crtl+K 剪切光标后 crtl+U 剪切光标前 crtl+Y 粘贴前面的内容
export
export $a             # 声明全局变量

unset $a              # 撤销变量

readonly a=2          # 只读变量,无法撤销
重定向
# 输入输出重定向
# # 标准类型
>   # 重定向文件,会覆盖 
>>  # 追加向文件,会追加
# # 错误类型
error command   2> 文件  # 覆盖,命令的错误输出
error command   2>> 文件 # 追加,命令的错误输出
# # 正常和错误同时保存
command > file 2>&1 # 覆盖,错误及正常的保存同一文件
command >> file 2>&1 # 追加,错误及正常的保存同一文件
command $> file # 覆盖,错误及正常的保存同一文件
command $>> file # 追加,错误及正常的保存同一文件
command >> file1 2>>file2 # 正确的追加到文件1,错误追加到文件2
shell 单双引号
# shell 的单双引号
[root@localhost ~]# name=abc
[root@localhost ~]# echo '$name'
$name
[root@localhost ~]# echo ''$name''
abc
变量设置规则
变量名称可以由字母、数字和下划线组成,但不能以数字开头。
变量的默认类型都是字符串型
变量用等号连接值,等号左右两侧不能有空格。
变量的值如果有空格,需要使用单引号或者双引号苦括起来。
不能使用标点符号
位置参数
# 熟悉 
$n   # 对应参数
$*   # 所有的参数,作为一个整体
$@   # 所有的参数,单独作为 
$#   # 所有参数的个数
[root@localhost ~]# vim canshu02.sh
#!/bin/bash

echo $0   #表示接受命令本身
echo $1   #接受第一个参数
echo $2   #接受第二个参数
echo $3   #接受第三个参数

[root@localhost ~]# ./canshu02.sh 111 222 333
./canshu02.sh
111
222
333
[root@localhost ~]# vim canshu03.sh
#!/bin/bash

sum=$(( $1+$2 ))
echo "sum is : $sum"

#举例说明$*和$@的区别
[root@localhost ~]# vim canshu04.sh
#!/bin/bash
for i in "$*"
    do
        echo $i
    done

for y in "$@"
    do
        echo $y
    done

[root@localhost ~]# ./canshu04.sh 111 222 333 444
111 222 333 444
111
222
333
444
#$*将所有参数看成一个整体,$@传递的每个参数区分对待
 
预定义变量
$?   # 上一次执行结果的状态,
$$   # 当前进程的PID
$!   # 后台运行的最后一个进程号 PID
运算
# 数值运算
declare [param] name
-  # 给变量设定类型属性
+  # 取消变量的类型属性
-i  # 声明整型
-x  # 将变量声明未环境变量
-p  # 显示被声明的类型

#给变量aa和bb赋值
[root@localhost ~]# aa=111
[root@localhost ~]# bb=222
[root@localhost ~]# declare -i cc=$aa+$bb 
                    同 cc=$(expr $aa + $bb ) [注意“+”号左右两侧必须有空格]
                    同 cc=$(( $aa+$bb ))  

# expr  运算符,可加减乘除
正则表达式
*       # 匹配0次或多次
.       # 匹配除换行符的任意一个字符
[]      # 匹配中括号中指定一个任意一个字符,只匹配一个
[^]     # 匹配除中括号的字符以外的任意一个字符
\{n\}   # 表示前面的字符恰好出现n次,eg: [0-9]\{4\} 匹配4位数字
\{n,\}  # 表示至少匹配字符不少于n次
\{n,m\} # 匹配字符出现在[n-m]次
注意:grep 匹配加\,egrep 转义无需加 \
字符截取命令
cut [param] filename
-f  # 列号
-d  # 分隔符,第一列从1开始
eg: command | cut -d '|' -f 1  # 匹配以|分隔的第一列字符
注意:cut 不可以用空格作为分隔符,只用作制表符分割
awk 命令
awk 'pattern' file '{print $n}'    # 打印第n列数据
eg: df -h | awk '{print $1 "\t" $5}'  # 打印提取第一列和第二列

eg: df -h | awk '{print $5}' | cut -d "%" -f 1  # 查看占用百分比截取%
seq 命令
sed [param] `action`  filename
# param
-n    # 只打印经过sed命令处理的数据
-e    # 容许输入多条sed命令编辑
-i    # 用sed修改结果直接修改读取数据,文件改变
# action
a\    # 追加
c\    # 行替换
i\    # 插入
d     # 删除指定的行
p     # 打印指定的行
s     # 字符串替换,格式:'行范围+s/old_str/new_str/g'

eg: 
sed -n '2p' test.log     # 查看第二行数据 
sed '1,3d' test.log      # 查看除1-3行的数据
sed '3a hello' test.log  # 增加第三行的hello输出数据
# replace
sed  '3s/oot/eet/g' my.log # 将第三行的oot改变为eet输入
sed -i '3s/oot/eet/g' my.log # 将第三行的oot改变为eet,文件改变
整数比较
[1 -param 2] && ehco yes || echo no 
# param
-eq  # ==
-ne  # !=
-gt  # >
-lt  # <
-ge  # >=
-lt  # <=
多重条件判断
# 字符判断
-z str  # 判断是否为空
-n str  # 判断是否非空
-a    # &
-o    # |
eg:  
[ -n "$aa" -a "$aa" -gt 23 ] && echo yes || echo no   # 打印 yes
    
if 判断
if  [conition];then
    pass
fi

eg: 
#统计首个程序根分区使用率
rate=$(df -h | awk '{print $5}' | cut -d "%" -f 1 | head -n 1)

if [ $rate -ge 20 ]
  then
echo "error 10"
fi
# if--else多条件
if [conition]
    then
        pass
elif
    then
        pass
else 
    then
        pass
fi
# 单条件
if [conition]
    then
        pass
    else
        pass
fi
case 判断
# case语句

case $变量名 in
  "值1")
      如果变量的值等值1,则执行程序1
      ;;
   "值2")
      如果变量的值等值2,则执行程序2
      ;;    
    ……省略其他分支
    *)
       如果变量的值都不是以上的值,则执行程序
       ;;
esac

举例:

#!/bin/bash
#测试case语句

echo "如果想去上班,请输入“1”"
echo "如果不想上班,请输入“2”"
echo "如果想居家办公,请输入“3”"

read -t 30 -p "请输入你的选择:" choose
case "$choose" in
        "1")
                echo "想去上班!"
                ;;
        "2")
                echo "不想去上班!"
                ;;
        "3")
                echo "居家办公!"
                ;;
        *)
                echo "只能输入1或者2或者3"
                ;;
esac


# read  -t 时间单位s   -p  提示
for 循环
# 语法1
for i in 值1 值2 值3  # 同 for ((初始值;循环控制条件;变量变化))
    do
        pass
    done
eg1: done # for循环完毕后,最后执行一次
for i in 1 2 3 4 5 6
    do
            echo $i
    done
eg2:
s=0
for (( i=1;i<=100;i=i+1 ))
        do
                s=$(( $s+$i ))
        done                     
            echo "$s"
while 循环
while [condition]
    do 
        pass
    done

eg:
#从1加到100 

i=1
s=0

while [ $i -le 100 ]
#如果变量i的值小于等于100,则执行循环 
    do
        s=$(( $s+$i ))
        i=$(( $i+1 ))
    done
    echo "The sum is: $s"
until 循环
# 循环,和while循环相反,until循环时,只要条件判断式不成立,则进行循环
#从1加到100

i=1
s=0

until [ $i -gt 100 ]
#循环直到变量i的值大于100,循环就停止了 
    do
        s=$(( $s+$i ))
        i=$(( $i+1 ))
    done
    echo "The sum is : $s "

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值