linux-day5
服务监听
ps -aux | grep nginx #查看服务
pstree # 树形查看服务
netstat -anop | grep :80 # 监听网络连接状态
kill -9 进程号
管道
管道的操作符是 " | ",它只能处理经由前面一个指令传出的正确输出信息,然后传递给下一个命令,作为下一个命令的标准输入。
注意:
管道命令只能处理前一个命令的正确输出,不能处理错误输出。
管道命令的右边命令,必须要能够接收标准的输入流才行
常用:
netstat -anop |grep :80
ls -al | more
有些命令无法接受输入流,需要通过xargs来将输入流转换成为命令行参数。
find -name a.txt | xargs rm -rf #查找并删除
重定向(>,>>)
输出重定向:
ls > 1.txt # 会新建文件,若文件已存在,会清空
ls >> 1.txt # 追加到文件末尾,若文件不存在则创建
错误重定向:
ls /xxx 2> 1.txt # 将标准错误重定向到1.txt(2>表示有错误才重定向)
同时重定向输出和错误:
ls /xxx /home &> 1.txt # 将标准输出和错误同时重定向到1.txt文件 (&>表示同时重定向)
多个命令
cmd1;cmd2 执行完成第一个命令以后,紧接着执行下一个命令。如mkdir a;ls -al
cmd1 || cmd2 如果前面的命令执行成功了,后面的命令就不再执行了;前面的命令执行失败以后,才能回执行后面的命令
cmd && cmd2 前面的命令执行成功以后,才会执行后面的命令;如果前面的命令执行失败,后面的命令就不再执行 make&&make install
shell编程
一、基本
shell是批处理文件,一般是sh结尾的文本文件,如a.sh
三种执行方法 :
- bash a.sh
- source a.sh
- ./a.sh # 此时要保证a.sh具有执行权限,比如用chmod a+x a.sh增加权限
二、Shell 脚本首行
脚本文件第一行通过注释的方式指明执行脚本的程序。
在 Shell 脚本中, # 开头的文本是注释, 但第一句 #! 开头的这句话比较特殊, 他会告诉 Shell 应该使用哪个程序来执行当前脚本。
常见方式有:
#!/bin/sh
#!/bin/bash
#!/usr/bin/env bash
Python 脚本的第一句一般是 #!/usr/bin/env python
三、第一个脚本
#!/bin/bash
echo "Hello"
echo "I am `whoami`"
echo "I love Linux"
echo "The CPU in my PC has `cat /proc/cpuinfo |grep -c processor` cores"
exit 0
- 字符串可用单引号、双引号或者不用引号
- ``反引号表示执行linux命令
- 查看脚本的退出状态: echo $? 为0则正常
变量
变量 : a=5
使用变量:$a
#!/bin/bash
a=10
echo there are $a people.
echo 'there are $a people."
无引号和双引号中, a 指 向 变 量 a 单 引 号 中 , a指向变量a 单引号中, a指向变量a单引号中,a就是$a,输出:there are $a people.
$
(
c
m
d
)
表
示
执
行
命
令
,
如
(cmd) 表示执行命令,如
(cmd)表示执行命令,如(whoami),等价于whoami
$((1+1)表示执行运算1+1
$的特殊值
$# 代表传入参数的个数
$@ 代表传入参数的列表
$0 代表脚本本身 (脚本名字)
$1 代表传入的第一个参数,$2,$3…以此类推
bash abc.sh 参数1 参数2 执行时可以传参
脚本就可以通过 echo $1输出第一个参数:“参数1”
$* 以字符串方式显示所有传入的参数 echo @* 输出所有参数
$# 显示所有传入的参数数量
$$ 脚本运行的进程ID
$? 显示脚本执行结果,0表示没有错误
全局变量
定义当前Shell下的全局变量
- 定义: export ABC=9876543210123456789
- 定义完后, 在终端里用 source 加载脚本: source ./test.sh
- 查看 echo $ABC
常用的全局系统环境变量
$PATH: 可执行文件目录
$PWD: 当前目录
$HOME: 家目录
$USER: 当前用户名
$UID: 当前用户的 uid
修改PATH:
export PATH=$PATH:/home/laijunyong/Documents/
上述办法重新连接会丢失,持久化方法:
在~/.bashrc 后添加上述语句,退出后执行source ~/.bashrc
获取用户输入
read -p “请输入一个数字:” num
echo “您输入的是:$num”
if else
abc.sh
a=10
if [ $a -gt 5 ] # 比较语句不能用$a>5,必须要用条件测试命令[ 10 -gt 5 ],中括号两边要有空格,比较条件如下
then
echo "a>5"
else
echo "a<=5"
fi
then
echo "a>5"
else
echo "a<=5"
fi
编辑完毕要执行:bash abc.sh或source abc.sh
if ls / #执行返回是0则为True,其他为false
then
echo "right"
else
echo "wrong"
编辑完毕要执行:#source abc.sh
read -p "input a directory:" dir
if [ -d $dir ]
then
echo "$dir是个文件夹"
else
echo "$dir不是文件夹"
fi
case语句
case "$var" in
exp1)
command1
;;
exp2)
command2
;;
exp3)
command3
;;
*)
comman4
;;
esac
示例:
#!/bin/bash
read -p "请输入数字" num
case $num in
0)
echo 星期日
;;
1)
echo 星期一
;;
2)
echo 星期二
;;
3)
echo 星期三
;;
4)
echo 星期四
;;
5)
echo 星期五
;;
6)
echo 星期六
;;
*)
echo 其他
;;
esac
for循环
for 变量 in 序列
do
要执行的命令
done
示例:
#打印1-10的偶数
for i in `seq 1 10`
do
if [ $[ $i % 2] == 0 ]
then
echo "偶数: $i"
else
echo "奇数: $i"
fi
done
#c语言风格的for循环
for ((i=0; i<10; i++))
do
echo "num is $i"
done
函数
格式:
function foo() {
echo "---------------------------"
echo "Hello $1, nice to meet you!"
echo "---------------------------"
echo $1 #a
echo $2 #b
}
foo a b c d # 调用并传参
函数的使用
在终端或脚本中直接输入函数名即可,不需要小括号
传参也只需将参数加到函数名后面,以空格做间隔,像正常使用命令那样
foo arg1 arg2 arg3 ...
数组
数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。
与大部分编程语言类似,数组元素的下标由0开始。
定义数组
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 ... valuen)
# 示例
arr=(hello good "yes" a 12)
#或者
nums[0]=1
nums[1]="good"
nums[2]=yes
修改值
arr=(hello good "yes" a 12)
arr[0] = hi
# 或者:
echo ${arr[0]}
# 获取所有值
echo ${arr[*]}
# 获取长度
echo ${#arr[*]}
# 遍历
for ele in ${arr[*]}
do
echo $ele
done