[ -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~1~n
添加到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 在当前行下另起一个空行输入