shell笔记

1 &&   a && b #a为真才执行b

||        a || b     #a为假才执行b
ping -c1 www.baidu.com && echo "ok" || echo "no"
2. expect perl java python shell
3. cat 1.txt >> 2.txt
4. python << -EOF(JWW)
print "hello"
EOF
5. ./2.sh 子shell执行
. 2.sh source 2.sh 当前shell执行
6. /etc/profile 系统
/etc/bashrc
~/.bash_profile 用户级
~/.bashrc
~/.bash_logout 离开的时候执行
~/.bash_history
7. login shell {/etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc}
nologin shell {/etc/bashrc ~/.bashrc}
8.cat /etc/shells
9. !1020 指定历史命令
10. histroy shell历史命令
11 head 命令?
12 !string eg: !da 找到最近的一条以da开头的命令
13 !$ 上一条命令的最后一个参数
14 !! 上一条命令
15 nohup sleep 10 &
16 screen
17 fg %1 bg %1 kill %3
18 cat <1.txt >2.txt
19 cat <<-EOF >file
...
...
EOF
20.管道 tee
21 cd #到家目录
22 ; 间隔两条命令 cd /home/444; ls 没有逻辑判断
23 && || 具备逻辑判断 ./configure && make && make install
24 true 返回真 false返回假
25 &> 混合重定向
26 [abc] 匹配一个
?1个
* 任意多个
() 在子shell执行
\ 转义
27 umask
28. mkdir -pv /home/{333/{aaa,bbb},444}
29. cp -rv ./memcmp.c{,.old}
30. echo -e "\e[1;31mThis is a red text."
echo -e "\e[1;30mThis is a red text."
echo -e "\e[1;32mThis is a red text."
echo -e "\e[1;33mThis is a red text."
echo -e "\e[0m"
echo -e "\e[1;30mThis is a red text.\e[0m"
颜色30几 背景色40几
31 printf
32.type -a [
33 export 环境变量 在当前shell和子shell中生效
自定义变量在当前shell生效
34 ./ping.sh 是在子shell执行
35 echo ${#ip} 显示变量的长度
36 env 所有的变量
37 $1 命令行参数
38 预定义变量
$0 脚本名
$* 所有的参数
$@ 有的参数
$# 参数的个数
$$ 当前进程的pid
$! 上一个后台进程的pid
$? 上一个命令的返回值 0表示成功
39. basename dirname mingl
40 ``命令替换=$()
41 read -n2 只读取前面的2个字符
read -t5 = read -t 5 #等待5s,没有用输入就返回
read name sex age 可以读取多个变量
42 ""弱引用 ''强引用
43.date +%F
44 整数运算
expr $num1 + $num2
$((num1+num2))
$[]
let num=1+2
45 free -m |grep 'Mem:' | awk '{print $3}'
46 bash -vx 1.sh #调试的模式执行
47 小数运算
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc
awk 'BEGIN{print 1/2}'
grep 'ServerIp1' iptvconfig.ini | awk -F"=" '{print $2}'
echo "print (5.0/2)" |python3
48 内容删除
url=www.sina.com.cn
echo ${url#www.}#删除www.
echo ${url#*.}#删除到. 最短匹配
echo ${url##*.}#删除到最后一个. 贪婪匹配
echo ${url%.*}从后往前删到. www.sina.com
索引及切片
echo ${url%%.*}从后往前删到最后一个. www
echo ${url:0:5} #0标识开始索引,5标识长度,长度省略就取到最后
替换 / //
echo ${url/sina/baidu}
echo ${url//n/N}
替代 - :-
-没有定义过的变量会替代,定义过的变量就不能替代
echo ${var1-11111}
:-变量没有被赋值或空值会替代,被赋过值不会替代
echo ${var:-222}
扩展+ :+ = := ? :?
49 unset var 重置变量
50 []条件判断 -z 长度为0
51调试
sh -n 1.sh 仅调试语法错误
sh -vx 1.sh 以调试的方式执行,查询整个执行过程
52 test -d /home/xpy echo $?
53. 字符串习惯性加上双引号
54.seq
55. 正则表达式 ^[0-9]+$ ^开头 +前面字符有1到多个 $结尾
56 declare 定义类型
57 单方括号不支持表达式,要使用2个方括号 [[ $num =~ ^[0-9]+$ ]]
=~正则匹配
58. case var in
模式1)
command1
;;
模式2)
command2
;;
模式3)
command3
;;
*)
command4
esac
59. command -v
60 true = :
61 脚本自启动把脚本的路径放在.bash_rc 或.bash_profile
62 trap 捕捉信号
63 echo -n 不换行
64 函数跟c类似 func () {}
65 uptime
free -m
66 clear = ctrl + l
67 until false
68 设置dns /etc/resolv.conf
nameserver ****
69 systemctl status httpd
70 ss -tnlp |grep vsftpd
netstat -tnlp |grep vsftpd
71 IFS=$'\n' 更换分隔符
72 echo "$ip" tee -a ip.txt
73 for i in {2..254}
74 >ip.txt 清空文件
75 ping -c1 -W1 ip
76 多个语句{}& 后台运行
77 wait 等待后台进程执行结束
78 time commad
79 printf" ip:$ip"
80 seq -w $num
81 echo "$line" |awk '{print $1}'
82 for是按照空格或tab分割的 #不适合处理文件
83 `` = $()
84 ssh $ip "sed -ri '/^#UseDNS/cUseDNS no' /etc/ssh/sshd_config"
85 在命令行下验证, ssh $ip "grep 'DNS' /etv/ssh/sshd_config"
86 while read user #适合处理文件,以行为单位。所以要单独处理空行
do
useradd $user
done < user.txt
87 until 和while完全相反 条件为false一直循环,为真则退出
88 shell并发控制
ll /proc/$$/fd (ubuntu暂时没找到对应的目录)
exec 6<>file 打开一个文件
exec 6<&- 关闭文件描述符为6的文件
当一个文件描述符未被释放,即使删除文件,这个文件还在/proc/$$/fd
lsof 列出打开的文件
89 mkfifo fifo1 命名管道可以跨终端,并且读取一次就没有了
匿名管道不可以跨终端
90 echo >&8 #往8文件描述符里放一个换行 &8标识文件描述符为8的文件
read -u 8
91 vim set list 看是空格还是tab
92 /usr/bin/expect <<-EOF <<之后不能有空格
93 ssh-copy-id ip
94 shell 关联数组
declare -A info1
info1=([name]=tianyun [sex]=male [age]=36 [height]=170) 需要先声明
echo ${info1[name]} #访问一项
echo ${info1[@]} #访问所有 = echo ${info1[*]}
echo ${#info1[@]} #数组的个数
echo ${!info1[@]} #数组的索引
95 declare -a
96 array=(1 2 3 4 5 6 7 "linuxshell" [20]=saltstack) #可以切片
echo ${array[@]:6:2} 7 linuxshell
echo ${array[@]:6:3} 7 linuxshell saltstack
97 OLD_IFS=$IFS
IFS=$'\n'
IFS=$OLD_IFS
98 watch -n1 a.sh #1s监控脚本的结果
99 vim ctrl+v y p #复制部分行
100 shell 函数
函数名(){}
function 函数名{}
101 for((i=1;1<=10;i++))
-------------------------------------
102 ed行编辑器
eg:ed back.c
显示文件的字节数,包括字符串结尾标志
n:显示第n行的内容
103 统计最后一列的个数
awk -F: '{shells[$NF]++} END{for(i in shells) {print i, shells[i]}}' passwd
104 wc -l file #统计文件中有多少行
105 awk使用外部变量,双引号的使用情况
var="bash"
echo "unix script" | awk "gsub(/unix/, \"$var\")"
awk使用外部变量,单双引号的使用情况
var="bash"
echo "unix script" | awk 'gsub(/unix/, "'"$var"'")'
106 int()取整数部分
df -h | awk '{ if(int($5)>10){print $6,$5}}'
107 awk参数-v, 注意变量var不用$
echo "unix script" | awk -v var="bash" 'gsub(/unix/, var)'
108 实战
1)查看CPU利用率与负载(top, vmstat, sar)
2)查看磁盘,inode利用率与i/o负载(df, iostat, iotop, sar, dstat)
3)查看内存利用率(free, vmstat)
4)查看cpu与内存占用最高的10个进程(top, ps)
5)查看网络流量(ifconfig, iftop, iptraf)
109 PS1# PS2 '>'
PS3#脚本中的提示符
110 select i in cat tiger duck pig
do
case "$i" in
cat)
command
;;
tiger)
command
;;
quit)
break
;;
*)
echo "error"
exit
;;
esac
done
111 打印第一列 cut -d' ' -f1== awk '{print $1}'
112. ping -s 6000 ip
113. chattr +i /etc/resolv.conf
i:不得任意更动文件或目录
114 ll -t;ll -rt
115 tree
116 截取字符串
${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。
${string#*chars} 从 string 字符串第一次出现 chars 的位置开始,截取 chars 右边的所有字符。
${string##*chars} 从 string 字符串最后一次出现 chars 的位置开始,截取 chars 右边的所有字符。
${string%chars*} 从 string 字符串最后一次出现 chars 的位置开始,截取 chars 左边的所有字符。
${string%%chars*} 从 string 字符串第一次出现chars 的位置开始,截取 chars 左边的所有字符。

117 shell读文件的三种方法
while read line
do
echo $line
done < filename
------------------
cat filename | while read line
do
echo $line
done
-----------------------
for line in `cat filename`
do
echo $line
done
-----------------------
116 nginx -v
sudo service nginx start
sudo service nginx stop
sudo nginx -s reload
117 C:\Windows\System32\drivers\etc\HOSTS

118 -r file     用户可读为真
-w file     用户可写为真
-x file     用户可执行为真
-f file     文件为正规文件为真
-d file     文件为目录为真
-c file     文件为字符特殊文件为真
-b file     文件为块特殊文件为真
-s file     文件大小非0时为真
-t file     当文件描述符(默认为1)指定的设备为终端时为真

119 . a.sh

#!/bin/bash

# Variable

my_var="Hello, world!"

# Function definition

my_function()

{

echo "This is a function."

}

. 命令使脚本中的变量设置和函数定义在当前shell环境中生效,

命令行可以执行:echo $my_var和执行函数:my_function

120 [ -n $a ] 判断a的值为非零

121 type命令用于查找 shell 命令的类型

type [-t| -a|-p] #type | all | path

122 eval 用于执行命令字符串

两次扫描

test.txt内容:hello shell world!

myfile="cat test.txt"

(1)echo $myfile  #result:cat test.txt

(2)eval echo $myfile  #result:hello shell world!

从(2)可以知道第一次扫描进行了变量替换,第二次扫描执行了该字符串中所包含的命令

获得最后一个参数

echo "Last argument is $(eval echo \$$#)"

echo "Last argument is $(eval echo $#)"

 

posted @ 2022-07-22 09:10  MoonXu  阅读(32)  评论(0编辑  收藏  举报