shell 脚本编程

[ -f 1618.txt] && echo 0 || echo 1

变量尽量小写,变量不能以数字开头,不能以特殊字符开头;
host_ip
man history
cat -n ~/.bash_history

局部变量 local 只能在函数中

hello='hi'
var()
{
local hello='hello world'
echo $hello
}
var
echo $hello 

输出 hello world
hi

export 实现的作用是扩展

hello='hi'
var()
{
export hello='hello world' 
}
var
echo $hello

输出 hello world

cat 2000.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -5

awk ‘{print $1}’
awk是用来提取列的主要工具;
{print $1}就是将某一行(一条记录)中以空格为分割符的第一个字段打印出来

sort -nr 大小排序
uniq -c 统计数量,相同ip显示一次
head -5 前5个

curl ip.cn?=222.24.51.56
#!/usr/bin/expect -f

spawn ssh cyl@localhost
expect "*password:*"
send "123\r"
expect "*$*"
send "hello\r"
send "exit\r"
expect eof
#!/bin/bash

ip=`ifconfig ens33|grep 't a'|awk -F'[ :]+' '{print $4"/"$8}'` 
echo $ip

n=((((((n+1))

https://www.cnblogs.com/aaron-agu/p/5700650.html.

使用[]和[[]]的时候不要吝啬空格,每一项两边都要有空格,[[ 1 == 2 ]]的结果为“假”,但[[ 1==2 ]]的结果为“真”!
使用 [[ ]] 时需要用空格分隔各值和运算符
1、[[ ]]不是一个命令,是bash里面的一个关键字。
2、支持字符串的模式匹配。

$ []
支持+ - * / %:分别为 “加、减、乘、除、取模”。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。

get_uid_shell()
{
	cat /etc/passwd|grep $user|awk -F: '{print $3,$NF}'
}

while :
do
	read -p ">>>>" user
	[[ "$user" = "q" ]] ||[[ "$user" = "Q" ]] && break
	[[ -z $user ]] && continue
	id $user &>/dev/null
	[ $? -eq 0 ] && get_uid_shell || echo "user no exist"
done 

请尽量使用内部命令而不是外部命令
外部 &((1+1))
内部 expr 1 + 1

|awk -F ‘[ :]+’ ‘{print $3}’
[ :]+这个是正则表达式,+表示一个或多个,这里就表示一个或多个空格或冒号

cat> 文件名<<eof
用来创建文件
在这之后输入任何东西 都是在 文件里的
输入完成之后EOF结尾 代表结束
比如


cat > 1.txt <<eof
1
2
3
4
5
eof

就是创建1.txt这个文件里面内容是 1 2 3 4 5

wc -l 统计列数

grep ssh |grep -v grep     #grep 也是进程会显示出来带ssh的grep进程,grep -v grep排除 显示grep的行

lsof 显示打开的文件
lsof -i 查看端口

lsof -i :22   #ssh默认开启后端口为22

grep -i 忽略大小写。

【1】 shell中0,0,0,?,$!等的特殊用法
变量说明:
$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
∗所有参数列表。如"* 所有参数列表。如"所有参数列表。如"*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
@所有参数列表。如"@ 所有参数列表。如"@所有参数列表。如"@“用「”」括起来的情况、以"$1" “2"…"2" … "2""n” 的形式输出所有参数。
$#
添加到Shell的参数个数
$0
Shell本身的文件名
1~1~1n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
我们先写一个简单的脚本,执行以后再解释各个变量的意义

touch variable

vi variable

脚本内容如下:

#!/bin/sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"

保存退出
赋予脚本执行权限

chmod +x variable

执行脚本

./variable aa bb

number:2
scname:./variable
first: aa
second:bb
argume:aa bb
通过显示结果可以看到:
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1是传递给该shell脚本的第一个参数
$2是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表

shell中可能经常能看到:>/dev/null 2>&1

命令的结果可以通过%>的形式来定义输出
/dev/null 代表空设备文件

代表重定向到哪里,例如:echo “123” > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

那么本文标题的语句:
1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

in UNIX
0 = stdin
1 = stdout
2 = stderr

telnet localhost 22

talnet测试端口是否连接
cmd中,命令: talnet IP或域名 端口号

curl -I www.baidu.com

判断服务的状态的三种方法
以数据库为例

/etc/init.d/mysql status

ps -ef | grep mysql|grep -v grep|wc -l

lsof -i:3306 |grep -i listen |wc -l
mysql -uroot -p'xxxx'  #解释:-u后面跟用户名,-p后面写密码。

ps -ef 是用标准的格式显示进程的、其格式如下

其中各列的内容意思如下
UID //用户ID、但输出的是用户名
PID //进程的ID
PPID //父进程ID
C //进程占用CPU的百分比
STIME //进程启动到现在的时间
TTY //该进程在那个终端上运行,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。
CMD //命令的名称和参数
ps aux 是用BSD的格式来显示、其格式如下

[ $a - eq 0] && [ $b - eq 0] && [ $c - eq 0]  && echo "y" || echo "n"    #abc都为0 输出y  否则输出n

也可以这样写 美化 ,连接行用\

[ $a - eq 0] && \
 [ $b - eq 0] && \
[ $c - eq 0]  && \
echo "y" || echo "n" 

-a         与
-o        或
!        非

if [ $1 != j6 -a $1 != j6p -a $1 != imx6qp -a $1 != rcarm3 -a $1 != rcarm3n ];

文件比较运算符
-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]
filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string长度为零,则为真 [ -z “myvar"]−nstring如果string长度非零,则为真[−n"myvar" ] -n string 如果 string长度非零,则为真 [ -n "myvar"]nstring如果string长度非零,则为真[n"myvar” ]

cat 可以用来按行合并文件内容

cat a b > c

paste 按列合并文件内容

paste a b > c
cat a | sed -n '3p:3q'  #只读取第三行  读取到后退出
cat a | sed '$d'  #删除显示的最后一行,但此操作只是删除显示的最后一行,不会对文件有操作
sed -i '$d' a   #删除文件的最后一行,对文件有操作

cat a.sh |sed 'sg'  #将显示的内容的before全部替换为after, g表示全部替换 ,对文件不操作
cat a.sh |sed 's/before/after/g'  #将第一行的第一个before,显示的内容的before替换为after,对文件不操作
sed -i 's/before/after/g' a.sh #对文件有操作

vi 编辑的时候
输入

%s/after/before/g  #也可以还原回去
sed -i '17d' a.sh #删除第17行
sed -i '17.21d' a.sh #删除第17--21行
sed -i '1i#/bin/bash' a.sh #在第一行插入#/bin/bash

vi
编译器
a 在当前光标的地方下一个字符输入
i 在当前光标的地方输入。
o 在当前行下另起一个空行输入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值