linux shell 脚本攻略

2020-03-02  本文已影响0人  cdz620

linux shell 脚本攻略

[TOC]

1.基本概念与特征

基础

数学计算

let

no1=1
no2=2
let result=no1+no2
let no1++
let no1--
let no1+=6
result=$((no1+50))
result=$[ $no1 + 5 ]
result=$[ no1 + no2 ]

浮点数计算

echo "scale=2; 100*9.8111/1.0" | bc
echo "obase=10;ibase=2;1100101" | bc
echo "obase=8;16" | bc
echo "obase=2;18" | bc
echo "sqrt(100)" | bc
echo "10^2" | bc

重定向

常用重定向

ls * > ls.txt # 相当于 ls * 1> ls.txt
ls _ * 2> stderr.txt 1>stdout.txt # 相当于 ls _ * &> all.txt

tee

获取标准输入,重定向到文件和stdout,会过滤stderr

echo "haha" | tee -a stderr.txt stdout.txt - # 两个文件都是以追加的方式写入

文件重定向到命令

cmd < file

重定向脚本内部的文本

cat << EOL > log.txt
a
b
c
d
EOL

文件操作

exec 3<input_file.txt
cat <&3   # 相当于 cat <input_file.txt
exec 4>output_file.txt
cat "test line" >&4 # 相当于 cat "test line " > output_file.txt
exec 5>>output_file.txt
cat "haha" >&5

数组

普通数组(切片)

var_array=(1 2 3 four five )
inx=3
echo ${var_array[1]}
echo ${var_array[${inx}]}
# 所有的元素
echo ${var_array[*]}
# 数组长度
echo ${#var_array[*]}
# 切片
echo ${var_array[*]:2}
echo ${var_array[*]:2:2}  # ${var_array[*]:start:size} 
world="1234 56"
echo ${world:2:3}  # 34
## 切片负数操作
echo ${world:(-2)} #56

#  打印单个字符
line="hello world"
for word in $line;
do
    for((i=0;i<${#word};i++))
        do
            echo ${word:i:2}
        done;
done


# 字符串替换
word=0123456789 
echo ${word/23/xx}

关联数组

条件: bash 4.0+

declare -A map
map=([lmq]=cdz [1]=one)
echo ${map[lmq]} ${map[1]}
echo ${!map[*]} # 打印索引  key
echo ${map[*]}  # 打印值  value

alias

日期操作

获取日期字符创

时间字符串转化成其他格式

调试

两种方式:

函数

特点:

获取前一个命令的输出

三种方式:

IFS

一般IFS与for结合使用,IFS(interval field separator)定义分隔符,for 迭代处理

#!/bin/bash
#Desc: Illustration of IFS
line="root:x:0:0:root:/root:/bin/bash" 
oldIFS=$IFS;
IFS=":"
count=0
for item in $line;
do
     [ $count -eq 0 ]  && user=$item;
     [ $count -eq 6 ]  && shell=$item;
    let count++
done;
IFS=$oldIFS
echo $user\'s shell is $shell;

循环

更多参考:https://billie66.github.io/TLCL/book/zh/chap34.html

for 循环

IFS=" ";
for var in "hello" "lmq";
do
    echo $var;
done;
# hello lmq 迭代失败
for var in "hello lmq";
do
    echo $var;
done;
str="hello lmq"
# hello\nlmq
for var in $str;
do
    echo $var;
done;
array=(hello lmq)
for var in ${array[@]};
do
    echo $var;
done;
for i in {0..2};
do
    echo $i
done
for i in {a..z};
do
    echo $i
done
for i in {A..C};
do
    echo $i
done
for ((i=0;i<10;i++))
{
    echo $i
}

while 循环

while condition
do
    cmds;
done

until 循环

x=0
until [ $x -eq 9 ];
do 
    let x++;
    echo $x;
done

逻辑判断

更多参考:http://blog.csdn.net/ithomer/article/details/6836382

if...elif...else

if condition;
then
    cmds;
elif condition;
then
    cmds;
else
    cmds;
fi

逻辑运算符||与&&

算术比较

字符串比较

单中括号比较字符串偶尔会出错,推荐使用双中括号

2.常用命令

cat

find

ls

xargs

命令行接受参数的两种形式:

s1.txt stderr.txt
stdout.txt

tr

原理: tr set1 set2 , 从标准输入获取数据,根据set1 set
2 映射规则转换成新数据

检验 md5sum和shasum

# md5sum
➜  ~ md5sum *.txt > all.md5
➜  ~ md5sum -c all.md5 
a.txt: OK
b.txt: OK
stderr.txt: OK
stdout.txt: OK
# sha1
➜  ~ sha1sum -c all.sha1 
a.txt: OK
b.txt: OK
stderr.txt: OK
stdout.txt: OK

临时文件

temp_file="/tmp/var.$$"
echo ${temp_file}

分割文件 split & csplit

#todo

获取文件名和扩展名

原理,使用 %%,%, ##,# 删除字符:

file="test.backup.jpg"
echo file name: ${file%.*}
echo file name: ${file%%.*}
echo suffix name: ${file#*.}
echo suffix name: ${file##*.}

# 输出
file name: test.backup
file name: test
suffix name: backup.jpg
suffix name: jpg

自动化交互

#!/bin/bash
#Filename: interactive.sh
read -p "Enter number:" no ;
read -p "Enter name:" name
echo You have entered $no, $name;%

3.文件相关

生成任意文件大小

comm 文本文件的交集与差集

文件权限、所有权和黏置位

目录权限说明

权限修改

touch

超链接

head 与tail

只列出目录

wc 统计字符数

tree

4.文本处理

正则表达式

pattern 解释
. 大部分字符,不包含特殊字符,比如 \n, 真正的任意字符 [\S\s]
? 匹配之前[0, 1]
+ 匹配之前[1, ∞]
* 匹配之前[0, ∞]
9[^10] 匹配93,95,9a, 不匹配 91,92
` ` 匹配两边任意一个, Oct (1st 2nd)
() 创建一个用于匹配的子串,如ma(tri)? 匹配max或matrix
\b 单词边界, \bcool\b匹配cool,不匹配coolant
\B 非单词边界, cool\B 匹配coolant,不匹配cool
\w 单个单词字符,字母,数字与_, 不匹配空白符(回车,空格, &,等其他特殊字符)
\W 单个非单词字符

通配符与正则表达式区别

http://blog.csdn.net/huiguixian/article/details/6284834

grep

cut 按列截取数据

sed

eg

awk

docs: https://coolshell.cn/articles/9070.html

原理: awk -F : 'BEGIN{print "begin block"} PATTERN { execute cmds per line } END{print "end block" }' a.md5

tac

5.网路

wget

curl

6.综合使用的例子

tar

gzip gunzip

gzip只能压缩单文件,与tar归档后,再组合使用。

bzip2 bunzip2

压缩比率比gzip更高,用法同gzip

lzma unlzma

压缩比率更高,用法同bzip2

zip,unzip

注意与gzip的区别

base64

7. 网络进阶

ifconfig & iwconfig(无线配置)

host & nslookup

ping

fping

ssh

du

/usr/bin/time & time

shell 默认内建有个time命令,系统有个/usr/bin/time命令,第二个命令更强大,能获取的信息更多,支持通过制定的format输出

8.系统信息查看

who & w & users

uptime

查看系统启动了多长时间

last & lastba

last查看系统登录日志信息, lastb 查看系统用户登录的失败信息,root用户才能有权限查看

watch

默认定时2两秒执行某个命令,观察输出

ps

kill

常用的信号:

使用:

which & whereis & file & whatis

cpu 信息

cat /proc/cpuinfo

内存信息

cat /proc/meminfo

分区信息

cat /proc/partitions

/proc/pid 正在执行程序的一些信息

├── attr
│   ├── current
│   ├── exec
│   ├── fscreate
│   ├── keycreate
│   ├── prev
│   └── sockcreate
├── autogroup
├── auxv
├── cgroup
├── clear_refs
├── cmdline
├── comm
├── coredump_filter
├── cpuset
├── cwd -> [Error reading symbolic link information]
├── environ
├── exe -> [Error reading symbolic link information]
├── fd [error opening dir]
├── fdinfo [error opening dir]
├── io
├── limits
├── loginuid
├── maps
├── mem
├── mountinfo
├── mounts
├── mountstats
├── net
│   ├── arp
│   ├── bonding
│   │   └── bond0
│   ├── connector
│   ├── dev
│   ├── dev_mcast
│   ├── icmp
│   ├── igmp
│   ├── ip_mr_cache
│   ├── ip_mr_vif
│   ├── mcfilter
│   ├── netfilter
│   │   ├── nf_log
│   │   └── nf_queue
│   ├── netlink
│   ├── netstat
│   ├── packet
│   ├── protocols
│   ├── psched
│   ├── ptype
│   ├── raw
│   ├── route
│   ├── rt_acct
│   ├── rt_cache
│   ├── snmp
│   ├── sockstat
│   ├── softnet_stat
│   ├── stat
│   │   ├── arp_cache
│   │   └── rt_cache
│   ├── tcp
│   ├── udp
│   ├── udplite
│   ├── unix
│   ├── vlan
│   │   └── config
│   ├── wireless
│   └── xfrm_stat
├── ns [error opening dir]
├── numa_maps
├── oom_adj
├── oom_score
├── oom_score_adj
├── pagemap
├── personality
├── root -> [Error reading symbolic link information]
├── sched
├── schedstat
├── sessionid
├── smaps
├── stack
├── stat
├── statm
├── status
├── syscall
├── task
│   └── 1989
│       ├── attr
│       │   ├── current
│       │   ├── exec
│       │   ├── fscreate
│       │   ├── keycreate
│       │   ├── prev
│       │   └── sockcreate
│       ├── auxv
│       ├── cgroup
│       ├── clear_refs
│       ├── cmdline
│       ├── comm
│       ├── cpuset
│       ├── cwd -> [Error reading symbolic link information]
│       ├── environ
│       ├── exe -> [Error reading symbolic link information]
│       ├── fd [error opening dir]
│       ├── fdinfo [error opening dir]
│       ├── io
│       ├── limits
│       ├── loginuid
│       ├── maps
│       ├── mem
│       ├── mountinfo
│       ├── mounts
│       ├── ns [error opening dir]
│       ├── numa_maps
│       ├── oom_adj
│       ├── oom_score
│       ├── oom_score_adj
│       ├── pagemap
│       ├── personality
│       ├── root -> [Error reading symbolic link information]
│       ├── sched
│       ├── schedstat
│       ├── sessionid
│       ├── smaps
│       ├── stack
│       ├── stat
│       ├── statm
│       ├── status
│       ├── syscall
│       └── wchan
└── wchan
上一篇 下一篇

猜你喜欢

热点阅读