shell脚本使用技巧以及linux操作知识(玩转linux)



ssh远程连接
ssh root@172.124.012.157

查询主机的cpu架构
arch

查询主机的系统版本等
cat /etc/os-release
或者lscpu

查询系统内核版本
1、cat /proc/version
2、uname -a

查看cpu的使用情况(类比windows里面的任务管理器)
top
退出输入q

查看磁盘使用情况(已挂载的)
df -h
查看当前主机检测到的硬盘(已挂载的和未挂载的都检测出来)
lsblk


挂载命令
mount

lspci查看pci设备总线硬件
lspci

# linux系统两大族群以及yun,apt-get和wget
------------------RedHat系列:Redhat、Centos、Fedora等
#常见的安装包格式 rpm包,安装rpm包的命令是“rpm -参数”
# 包管理工具 yum
# 支持tar包
# yum可以用于运作rpm包,类似仓库。如对包的管理操作
安装:yum install
卸载:yum remove
更新:yum update
--------------------Debian系列:Debian、Ubuntu等
# 常见的安装包格式 deb包,安装deb包的命令是“dpkg -参数”
# 包管理工具 apt-get
# 支持tar包
安装:apt-get install
卸载:apt-get remove
更新:apt-get update
# wget不是安装方式,它是一种下载工具,类似于迅雷。通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载
wget 下载地址
# 如果当前ubuntu未安装wget,可按下列操作进行安装和检查是否安装成功:
sudo apt-get update  
sudo apt-get install wget  
wget --version 



系统hosts文件地址
/etc/hosts

用户家目录里的./local文件里面使用力的独有依赖文件,如python库等

给组添加用户
gpasswd -a user group
将用从组删除
gpasswd -d user group
查看组文件
cat /etc/group

查看服务状态所有
service –status -all 
查看服务状态单个详细
service 服务名 status

查看防火墙状态
service iptables status

关闭或者开启防火墙
 1) 重启后生效
     开启: chkconfig iptables on
     关闭: chkconfig iptables off
 2) 即时生效,重启后失效
     开启: service iptables start
     关闭: service iptables stop
 
查询指定端口号的占用情况
lsof -i:端口号
比如查看8000端口使用情况,lsof -i:8000

查询整体所有的端口情况
netstat 
-t (tcp) 仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化为数字
-l 仅列出在Listen(监听)的服务状态
-p 显示建立相关链接的程序名
netstat -tunlp |grep 端口号,用于查看指定的端口号的进程情况


scp远程跨主机复制传输
从本地服务器考到别的服务器
scp -r /home/test/localfilepath root@172.124.012.157:/home/remotetest
从别的服务器考到本地服务器
scp -r root@172.124.012.157:/home/remotetestdir /home/test/localfilepath


查看进程ps -ef 或者ps -aux

root@iZbp11vz1brexya9wf6w6eZ:~# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0  2020 ?        00:00:18 /lib/systemd/systemd --system --deserialize 19
root         2     0  0  2020 ?        00:00:00 [kthreadd]
root         4     2  0  2020 ?        00:00:00 [kworker/0:0H]


root@iZbp11vz1brexya9wf6w6eZ:~# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3 159772  7084 ?        Ss    2020   0:18 /lib/systemd/systemd --system --deserialize 19
root         2  0.0  0.0      0     0 ?        S     2020   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<    2020   0:00 [kworker/0:0H]

# 所谓的镜像源:可以理解为提供下载软件的地方,比如Android手机上可以下载软件的91手机助手;iOS手机上可以下载软件的AppStore
系统contos系统,自带yum源配置文件/etc/yum.repos.d/CentOS-Base.repo
yum和repo,epel详解https://blog.csdn.net/fantaxy025025/article/details/84918199?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

# 乌班图系统中镜像源地址备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
#乌班图系统的安装工具apt-get
sudo apt-get install package 安装包 
sudo apt-get update  更新源
[apt命令的详细](https://blog.csdn.net/weixin_41762173/article/details/79480832)

# linux系统的python安装配置
# linux自带Python2一般在usr/bin目录里
cd /usr/bin
# ----------------------------------------python的tar包下载安装方法
1.随便找个目录下载(或者有现成linux版本的tar包直接拖到这个目录)
wget <pythonlinux对应版本的下载路径>
如wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
2.yum下载对应Python的依赖工具(contos)
yum install -y gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

# 或者下面的安装
# yum -y install zlib zlib-devel
# yum -y install bzip2 bzip2-devel
# yum -y install ncurses ncurses-devel
# yum -y install readline readline-devel
# yum -y install openssl openssl-devel
# yum -y install openssl-static
# yum -y install xz lzma xz-devel
# yum -y install sqlite sqlite-devel
# yum -y install gdbm gdbm-devel
# yum -y install tk tk-devel
# yum install gcc

# sudo yum install zlib zlib-devel bzip2-devel openssl openssl-devel libffi-devel ncurses-devel xz-devel  python3-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel expat-devel



2.下载对应Python的依赖工具(Ubuntu)
sudo apt update -y
sudo apt install -y build-essential libncursesw5-dev libgdbm-dev libc6-dev zlib1g zlib1g-dev libsqlite3-dev tk-dev libssl-dev openssl libffi-dev python3-dev python3-smbus
3.解压文件夹
tar -zxvf Python-3.6.6.tgz(对应后缀对应命令)
tar -xvf Python-3.7.2.tar.xz
4.进去解压缩后生成的文件夹里面
cd Python-3.6.6
5.编译安装(解压缩目录执行)
./configure --prefix=/opt/python36   # 指定安装目录为/opt/python36
6.make(解压缩目录执行)
make
7.make install(解压缩目录执行)
make install
8.进入安装目录里面
cd 。。。。。
9.去配置环境变量(只需将python3和pip3程序的软连接建立到/usr/bin里面就可以了)
ln -s /opt/tool/bin/pip3 /usr/bin/pip3
# ----------------------------------------python的yum安装方法(暂时在研究)
sudo yum install epel-release

yum install -y gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

yum install python34

whereis python
[root@iZbp11vz1brexya9wf6w6eZ python3.4]# find / -name python3.4
/usr/lib64/python3.4目录
/usr/bin/python3.4可执行文件
yum install python36u-pip -y 或者yum install python34-pip -y
安装完成后自动在/usr/bin里面了全局pip3.4都可访问(但是软连接没配置,这里最好配置成pip3)
[root@iZbp11vz1brexya9wf6w6eZ bin]# whereis pip3
pip3: /usr/bin/pip3.4

或者yum install -y python36-setuptools--------easy_install-3.6 pip安装Pip(此方法家里试验失败)

# yum install -y epel-release 这个工具貌似需要装(具体干啥貌似是下载安安装最新的工具)
yum install -y epel-release

# 查看pip前缀的文件
ll pip*
-rwxr-xr-x. 1 root root      2291 Jul 31  2015 lesspipe.sh
-rwxr-xr-x  1 root root       215 Jul 11  2019 pip
-rwxr-xr-x  1 root root       215 Jul 11  2019 pip2
-rwxr-xr-x  1 root root       215 Jul 11  2019 pip2.7

# 重新设置pip文件软连接到python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
# pip临时使用某镜像源-i
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xxx库名

例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple gevent,这样就会从清华这边的镜像去安装gevent库。

# Linux下,修改镜像源 ~/.pip/pip.conf (没有就创建一个), 修改 index-url至tuna,内容如下:
 [global]
 index-url = https://pypi.tuna.tsinghua.edu.cn/simple
# windows下,直接在user目录中创建一个pip目录,如:C:\Users\马云\pip,新建文件pip.ini,内容如下
 [global]
 index-url = https://pypi.tuna.tsinghua.edu.cn/simple
 # python2的包一般在这里
 /lib/python2.7/site-packages/


# linux中的代理服务器配置
export http_proxy="http//username:passwd@ip:port"
export http_proxy="192.168.0.1:8080"
export https_proxy="192.168.0.1:8080"

# linux添加一个用户sudo权限
设置之前必须得安装sudo,安装方法
yum install sudo           //这个安装包很小,不到1M
su root //进入root用户
vim /etc/sudoers //打开sudo的配置文件
先找到如下图所示的一行:(root ALL=(ALL)ALL)
在“root ALL=(ALL)ALL”这一行下面,加入如下图所示的一行(用户名 ALL=(ALL) ALL),并保存
------------
语句意义详解
testuser ALL=(ALL) ALL
上述命令中:
testuser 表示用户名
第一个 ALL 指示允许从任何终端、机器访问 sudo
第二个 (ALL) 指示 sudo 命令被允许以任何用户身份执行
第三个 ALL 表示所有命令都可以作为 root 执行
以提升的权限执行命令
要用提升的权限执行命令,只需要在命令前加上 sudo,如下所示:
$ sudo cat /etc/passwd
当你执行这个命令时,它会询问 linuxtechi 的密码,而不是 root 用户的密码。

sudo免密码
root    ALL=(ALL)       ALL
weihang3    ALL=(ALL) NOPASSWD: ALL
weihang    ALL=(ALL:ALL) NOPASSWD: ALL


# id weihang显示用户的组和id等信息
id weihang
# 添加用户到特定组用户组
cat /etc/group
gpasswd –a 用户名 组名



# 查询一个包是否被安装rpm安装
rpm -q < rpm package name>
# 列出所有被安装的rpm package
rpm -qa
rpm -qa|grep "pcre"
# 升级一个软件包。
 rpm -Uvh  软件包名
 # 删除指定软件包
 rpm -e 软件包名
 # 强制删除已安装程序及其关联
 # whereis python |xargs rm -frv ##删除所有残余文件 ##xargs,允许你对输出执行其他某些命令
 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps ##强制删除已安装程序及其关联
 # 安装软件包并显示安装进度。这个是用得最多的了。
 rpm -ivh 软件包名
 rpm -ihv software-1.2.3-1.i386.rpm
 # --nodeps --force为不考虑依赖包,强制安装。
 rpm -ivh python-*   rpm-python-* --nodeps --force



# 查找所文件(包括隐藏文件)
ls -a 等价为 ls --all
ls -l  等价为  ll
# 返回的结果前面第一个为-的话是个文件,第一个为l的话是软连接,第一个为d的话是个目录
-rw-rw----
# 同时创建多个目录
mkdir /etc/ttt/ddd  /etc/ttt/ddd
# 迭代创建目录
# mkdir -p /etc/ttt/ddd
# cp -r复制目录
cp -r xxx/xxx

 




# grep的使用 
grep "被查找的字符串" 文件名
cat tt.txt | grep xxxxxx

# 从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行
find / -type f -name "*.log" | xargs grep "ERROR"

# linux不将结果输出到终端的方法
./test2.sh >/dev/null 2>&1
cat ttt.txt | grep pppp > /dev/null
# /dev/null:可以理解为linux下的回收站;
# 通过符号“>”把标准输出进行重定向;
# 2>&1:是把出错输出也重定向输出;

#  linux全局环境变量文件地址
/etc/profile
# 在文件中加入类似    export PATH=/directory:$PATH     export path=$path:/path1:/path2   然后保存,然后执行source /etc/profile    才能生效

# source xxxx.sh等价于. xxxxx.sh
# 用户变量地址(根目录底下各个名字就是各个用户的目录,里面都是.开头的  隐藏文件)
# 修改用户变量    linux下每个用户宿主目录下都有一个 ~/.bash_profile文件,里面记录直接加到文件里面,最后面export path=$path:/path1:/path2  source ~/.bash_profile执行应用成功 
# 或者这样
# /etc/profile 全局用户,应用于所有的Shell。
# /$HOME/.profile 当前用户,应用于所有的Shell。
# /etc/bash_bashrc 全局用户,应用于Bash Shell。
# ~/.bashrc 局部当前,应用于Bash Sell。
#  个人变量也有说这个的  ~/.bash_profile 
# 之后执行此文件使其生效 source /$HOME/.profile   


/etc/profile   # 系统的全局变量环境信息文件
/etc/profile.d/*.sh   # 系统全局
~/.bash_profile   # 当前用户的
~/.bashrc   # 当前用户的
/etc/bashrc   # 系统全局的


# /etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.
# /etc/bashrc:  为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
# ~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
############# ~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.
# ~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件.
 
# 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
       

# ldconfig配置环境变量
cd /etc
[root@iZbp11vz1brexya9wf6w6eZ etc]# cat ld.so.conf
include ld.so.conf.d/*.conf
cd ld.so.conf.d


set命令显示当前shell的变量,包括当前用户的变量;
env命令显示当前用户的变量;
env命令显示当前用户的变量;
# 显示所有环境变量
env
# 显示所有路径变量 
echo $PATH
# 删除环境变量unset命令
unset
unset [-fv][变量或函数名称]
-f 只删除函数
-v 只删除变量
foo="hello world"
echo $foo
unset foo
echo $foo

lx='ls -lh'
unset lx

# 查看历史纪录文件(可以排查问题)
~/bash_history



# 在需要安装的文件夹里面执行这个源码安装脚本,后面的是安装程序的安装路径
./configure --prefix=/usr/local/python3 
# 然后执行make编译和make iinstall安装
make
make install  
# 后面可以配置软连接





# linux中的软连接建立,软连接就是快捷方式
# 创建一个软连接
# ln -s是必须的,然后后面跟一个目标文件夹,最后是一个当前目录的软连接名。
# 使用ln -s命令时要使用绝对路径。!!!!!!!!!
# 前面的需要使用具对路径(必须),后面的软链接可以输入地址也可以不输(不输的话就是本目录下的这个名字)

ln -s test_chk/ test_chk_ln


test_chk
test_chk_ln -> test_chk/

# 软连接对应的目录也可以用在配置环境变量上,在环境变量中目录软连接,相当于进入相应的目录,如下
/home/weihang/wh/whtest.sh
cd /home/weihang2
ln -s /home/weihang test_ln
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/home/weihang2/test_ln/wh
cd /
whtest.sh    # 成功执行



# locate   配合数据库查看文件位置。
# whereis  查看文件的位置。
# find    实际搜寻硬盘查询文件名称。
whereis python 
# which指令会在环境变量$PATH设置的目录里查找符合条件的文件。
# which   查看可执行文件的位置。which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。
which python 


# 当使用记事本编写shell脚本时,执行时会出现报错^M之类的解决方法是在linux中# vim 打开文件然后:set ff=unix然后:wq 可以查询下sh脚本的格式set ff?

# ctrl-D退出
# ctrl-A光标移动到行命令最前,ctrl-E反之最后
# ctrl-S锁屏,ctrl-Q解锁


# 在一个脚本中使用别的脚本或者文件的变量或者什么的时候使用如下,这个的作用类似于Python中的import导入模块功能
. /home/xxx/xxx/xxx.sh


# $?判断的是上一个命令的运行结果码,如果上一个命令是成功的,那么$?的值是0,否则是别的值
echo $?

# ;分号表示第二个命令,相当于第二行的命令
# 变量赋值
ip=172.0.0.1
#变量的引用(此方法比较把稳,不容易出现歧义)
echo "${ip}" 
#变量的引用2
echo $ip
# -c表示只ping一次
ping -c $ip &> 
# 将命令的返回结果赋值给变量然后输出变量,第一种方法
var=`ll`;echo "${var}"

var=`ll`
echo "${var}"

# 第二种方法
var=$(pwd);echo "${var}"

echo "`pwd`"
echo "$(pwd)"



# 类似Pythoninput的read,可以实现输入功能
# -p的意思是将输入的字符串顺手赋值到变量score里面去,之后可以调用score来提取字符串
read -p "please input a score:" score

# -s 的意思是隐藏输入的东西,但是他不会换行,需要手动\n换行
read -sp "input your password:" password
if [[ $password == "www" ]]
then
	echo "\npassword is ok"
fi

read -p "input your password:" password
if [[ $password == "www" ]]
then
	echo "password is ok"
fi




# linux中的shell字符串拼接很简单 就是简单的一前一后放在一起就可以了如
path="/xxx/xxx/xxx"
path2="file.sh"
name="test""zifuchuan"
filepath="${path}""/${path2}"




# linux里面的while循环

while 条件
do
    循环体
done

while 条件;do
    循环体
done

while 条件;do 循环体;done

#!/bin/bash
n=1
while [ $n -le 10 ]
do
    echo $n
    let n++    #或者写作n=$(( $n + 1 )),整形变量之间的相加
done


# 这个程序是个死循环,将不停地等待您的输入,并回显出来
#!/bin/bash
while read var;do
    echo "您输入的是$var"
done

# 实现死循环
#!/bin/bash
while :
do
    echo I love you forever
done
# break 和comntinue跳过循环
# break跳出,continue跳过

# for 循环简述
for 变量 in 取值列表
do
    各种操作
done

数字性循环  #######################
#################    数字性循环

for((i=1;i<=10;i++));  
do   
echo $(expr $i \* 3 + 1);  
done 

for i in $(seq 1 10)  
do   
echo $(expr $i \* 3 + 1);  
done  

# 1-100的所有奇数的和注意花括号的迭代语法为{首..尾..增量}  
for i in {1..100..2}
do
    echo $i
done
来计算一下1到100的奇数的和

# 1-100
#!/bin/bash
ans=0
for i in {1..100}
do
    let ans+=$i
done
echo $ans



字符性循环  #######################
#################    字符性循环

for i in `ls`;  
do   
echo $i is file name\! ;  
done  

for i in f1 f2 f3 ;  
do  
echo $i is appoint ;  
done  


list="rootfs usr data data2"  
for i in $list;  
do  
echo $i is appoint ;  
done 


#! /bin/sh
# FRUIT是一个循环变量,第一次循环$FRUIT的取值是apple,第二次取值是banana,第三次取值是pear。 
    for FRUIT in apple banana pear; do
      echo "I like $FRUIT"
    done
    






# 文件或者文件夹的比较测试,放在中括号里,这里用路径来判断
# -b filename	当filename 存在并且是块文件时返回真(返回0)
# -c filename	当filename 存在并且是字符文件时返回真
# -d pathname	当pathname 存在并且是一个目录时返回真
# -e pathname	当由pathname 指定的文件或目录存在时返回真
# -f filename	当filename 存在并且是正规文件时返回真
# -g pathname	当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
# -h filename	当filename 存在并且是符号链接文件时返回真 (或 -L filename)
# -k pathname	当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真
# -p filename	当filename 存在并且是命名管道时返回真
# -r pathname	当由pathname 指定的文件或目录存在并且可读时返回真
# -s filename	当filename 存在并且文件大小大于0 时返回真
# -S filename	当filename 存在并且是socket 时返回真
# -t fd	当fd 是与终端设备相关联的文件描述符时返回真
# -u pathname	当由pathname 指定的文件或目录存在并且设置了SUID 位时返回真
# -w pathname	当由pathname 指定的文件或目录存在并且可写时返回真
# -x pathname	当由pathname 指定的文件或目录存在并且可执行时返回真
# -O pathname	当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
# -G pathname	当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真
# file1 -nt file2	file1 比file2 新时返回真
# file1 -ot file2	file1 比file2 旧时返回真
# f1 -ef f2	文件f1和f2是指向同一文件的硬链接,暂时理解为两个相同
# [ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。  
# [ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
# [ -S FILE ] 如果 FILE 存在且是一个套接字则为真。  
# [ -z STRING ] “STRING” 的长度为零则为真。  
# [ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。


# 判断文件是否存在,如果存在某文件,则删除
if [ -f trials ]; then rm ${result_path}trials; fi
# 判断文件是否存在,如果存在某文件,则删除(第二种写法)
if [ -f trials ]; then 
    rm ${result_path}trials
fi

# 注意要点
# 1、[  ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
# 2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
# 3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错


# 判断目录是否存在,不存在则创建一个目录,里面的文件名可带双引号也可不带
# -d的意思是判断这个东西是否存并且是一个目录
# -p的意思是迭代创建,一级一级的会创建下去
if [ ! -d $result_name ];then
      mkdir -p $result_name
fi

#判断文件或者目录是否存在,并且具有可执行权限
if [[ ! -x "$testFile" ]]; then
	echo "文件或目录不存在并且没有可执行权限"
else
	echo "文件或目录存在并有可执行权限"
fi




# 字符串的比较测试,也是放在中括号里
# -z string	字符串string 为空串(长度为0)时返回真
# -n string	字符串string 为非空串时返回真
# str1 = str2	字符串str1 和字符串str2 相等时返回真
# str1 == str2	同 =
# str1 != str2	字符串str1 和字符串str2 不相等时返回真
# str1 < str2	按字典顺序排序,字符串str1 在字符串str2 之前
# str1 > str2	按字典顺序排序,字符串str1 在字符串str2 之后
if [ "$test"x = "test"x ]; then

# ==的功能在[[]]和[]中的行为是不同的
#     1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true
#     2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true
#     4 [ $a == z* ] # File globbing 和word splitting将会发生
#     5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true

# 转义
#    if [[ "$a" > "$b" ]]
#     if [ "$a" \> "$b" ]



# 常见数值测试
if [ 1 -ne 1 ];then
...
fi
-eq:等于
-ne:不等于
-le:小于等于
-ge:大于等于
-lt:小于
-gt:大于
# int1 -eq int2	如果int1 等于int2,则返回真
# int1 -ne int2	如果int1 不等于int2,则返回真
# int1 -lt int2	如果int1 小于int2,则返回真
# int1 -le int2	如果int1 小于等于int2,则返回真
# int1 -gt int2	如果int1 大于int2,则返回真
# int1 -ge int2	如果int1 大于等于int2,则返回真
#    -eq 等于,如:if [ "$a" -eq "$b" ]
#    -ne 不等于,如:if [ "$a" -ne "$b" ]
#    -gt 大于,如:if [ "$a" -gt "$b" ]
#    -ge 大于等于,如:if [ "$a" -ge "$b" ]
#    -lt 小于,如:if [ "$a" -lt "$b" ]
#    -le 小于等于,如:if [ "$a" -le "$b" ]
#     大于(需要双括号),如:(("$a" > "$b"))
#    >= 大于等于(需要双括号),如:(("$a" >= "$b"))
# 测试退出状态:

# linux脚本中的默认变量

$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误(如果上一个命令是函数的,话显示函数的返回值,$?dirname 当前目录的文件名字(或者一个文件的绝对路径) -------->文件的上一级目录

if [ $? -eq 0 ];then
    echo 'That is ok'
fi

#!/bin/bash
while [ $# != 0 ];do
echo "第一个参数为:$1,参数个数为:$#"
shift
done









# if判断式
if [ 条件判断一 ] && (||) [ 条件判断二 ]; then
elif [ 条件判断三 ] && (||) [ 条件判断四 ]; then
else
#   执行第三段內容程式
fi

# &&
if [ $a = 0 -a $b = 0 ]&&[ $c != 0 ]; then
	echo success
fi

# 啰嗦一下,其实上面也有这个
# [ -a 文件 ] 如果文件存在为真。
# [ -b 文件 ] 如果 文件 存在 而且 是一个 块-特殊 文件为真。
#[ -c 文件 ] 为真 如果 文件 存在 而且 是一个 字-特殊 文件。
 

#[ -d 文件 ] 为真 如果 文件 存在 而且 是一个 目录。
#[ -e 文件 ] 为真 如果 文件 存在。
#[ -f 文件 ] 为真 如果 文件 存在 而且 是一个 普通 文件。
#[ -g 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SGID 位。
#[ -h 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。
#[ -k 文件 ] 为真 如果 文件 存在 而且 他的粘住位已经设置。
#[ -p 文件 ] 为真 如果 文件 存在 而且 是一个 已经命名的管道 (F 如果O)。
#[ -r 文件 ] 为真 如果 文件 存在 而且 是可读的。
#[ -s 文件 ] 为真 如果 文件 存在 而且 比零字节大。
#[ -t FD ] 为真 如果 文件 文件描述符已经打开 而且 指向一个终端。
#[ -u 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SUID (set user ID)位。
#[ -w 文件 ] 为真 如果 文件 为真 如果 文件 存在 而且 是可写的。
#[ -x 文件 ] 为真 如果 文件 存在 而且 是可执行的。
#[ -O 文件 ] 为真 如果 文件 存在 而且 属于有效用户ID。
#[ -G 文件 ] 为真 如果 文件 存在 而且 属于有效组ID。
#[ -L 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。
#[ -N 文件 ] 为真 如果 文件 存在 而且 has been mod 如果ied since it was last read。
#[ -S 文件 ] 为真 如果 文件 存在 而且 是一个 socket。
#[ 文件1 -nt 文件2 ] 为真 如果 文件1 has been changed more recently than 文件2, or 如果
#文件1 存在 而且
#文件2 does not。
#[ 文件1 -ot 文件2 ] 为真 如果 文件1 比 文件2 旧, 或者 文件2 存在而且 文件1 不存在。
#[ 文件1 -ef 文件2 ] 为真 如果 文件1 而且 文件2 refer to the same device 而且 inode
# numbers。
# [ -o 选项名 ] 为真 如果 shell 选项 "选项名" 开启。
# [ -z STRING ] 为真 如果 "STRING"的长度是零。
# [ -n STRING ] 或者 [ STRING ] 为真 "STRING"的长度是非零值。
# [ STRING1 == STRING2 ] 如果两个字符串相等为真。 "=" may be used instead # of "==" for
# strict POSIX compliance。
# [ STRING1 != STRING2 ] 为真 如果 两两个字符串不相等。
# [ STRING1 < STRING2 ] 为真 如果 "STRING1" sorts before "STRING2" # # # lexicographically in the
# current locale。
# [ STRING1 > STRING2 ] 为真 如果 "STRING1" sorts after "STRING2" lexicographically in the
# current locale。





# liunx中的echo "111111" > test.txt重定向是将输出结果写到一个文件中去输出结果不打印出来,如果被写入的文件不存在的话那么会自动创建一个这样的文件

# 多行大段内容的重定向写入(>是覆盖写入,>>是追加写在原本的内容的后面)
cat << EOF > test.sh
xxxxxxxxx
ssssssssss
EOF
cat << EOF >> test.sh
xxxxxxxxx
ssssssssss
EOF


# 显行输出
cat -n test.txt 


# sed的使用,            sed [选项] "[动作]" 文件名
# 默认一般会把所有数据都输出到屏幕
# 选项(-n,只输出sed处理的行到屏幕)
# 选项(-e,多条sed命令编辑)
sed -e '4s/99/22/g ; 4s/44/55/g' a.txt
# 选项(-i,直接修改文件,不在屏幕输出)

# 动作p(p,输出第几行)
sed -n '2p' a.txt
# 动作d(d,删除第几行,下面是二到四行)
sed -n '2,4d' a.txt
sed -n '4d' a.txt
# 动作a(a,在第几行后面追加一行什么内容)
sed -n '2a xxxx' a.txt
# 动作i(i,插入,在第几行前面插入一行什么内容)
sed -n '2i xxxx' a.txt
# 动作c(c,替换,替换第几行,替换整行)
sed -n '2c xxxx' a.txt
# 动作s(s,替换,替换行里的部分数据,将第四行中的所有的99都替换成22)
sed '4s/99/22/g' a.txt



# sed的使用(sed是以行为单位一行一行对文件或者内容中的内容进行处理的)
sed
# 删除含字符串"abc"或“efg"的行,将结果保存到a.log
sed '/abc/d;/efg/d' a.txt > a.log 
# sed将example.txt文件中每行中的的所有test替换成mytest(不会在文件中改变,只是暂时改变然后在屏幕打印出来)
sed 's/test/mytest/g' example.txt 
# 如果不带g则表示只会替换每行的第一个test为mytest,每行后面的test不会改变(不会在文件中改变,只是暂时改变然后在屏幕打印出来)
sed 's/test/mytest/' example.txt 

# 如果不带g则表示只会替换每行的第一个匹配到的,每行后面的不会改变(-i表示直接在文件中改变,不打印出来,可以使用元字符代表)
 sed -i "s/version=20.0.*/version=20.0.0/" weihangtest.info

#  删除ttt文件中以export weihang=开头的所有行(只是临时删除,然后打印到屏幕上,文件中真实的东西不变)
sed "/^export weihang=/d" ttt.txt
#  删除ttt文件中以export weihang=开头的所有行(在文件中删除,不会打印出来,-i就是在文件当中替换)
sed -i "/^export weihang=/d" ttt.txt
# 所有的yes替换成no(只是临时替换,然后打印到屏幕上,文件中真实的东西不变)
sed 's/yes/no/g' test.txt
# 同时替换多种类型(以分号隔开)
sed 's/yes/no/;s/static/dhcp/' test.txt
# 打印奇数行
sed -n '1~2p' test.txt
# 关于‘s///’命令的另一个妙处是:‘/’分隔符有许多替换方案,sed会将/usr/local替换为/usr,注意这里将:作为分隔符来使用,相当于之前的/就是,这块:
sed -e "s:/usr/local:/usr:g"
# 直接修改文件替换
sed -i -e "s:sososojsjs:7777777777777777777:" ttt.txt

# 正则元字符表达意思
/^love/ #love开头
/love$/ # love结束
# 匹配包含字符 l、后跟两个任意字符、再跟字母 e 的行(.匹配除换行外的单
个字符)
/l..e/ 
s/love/**&**/   # 即 love 变成**love**


#   -n	使用安静模式,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行

# -e	多重编辑,且命令顺序会影响结果
# -f	指定一个 sed 脚本文件到命令行执行,
# -r	Sed 使用扩展正则
# -i	直接修改文档读取的内容,不在屏幕上输出 

# g	在行内进行全局替换(s 命令用于替换。命令末端的 g 表示在行内全局替换;也就是说如果每一行里出现多个west,所有的 west 都会被替换为 north。如果没有 g 命令,则只将每一行的第一 west 替换为 north。)
# p	打印行
# w	将行写入文件
# x	交换暂存缓冲区与模式空间的内容
# y	将字符转换为另一字符(不能对正则表达式使用 y 命令)


tee命令类似于重定向,两个基本差不多(重定向一般不会将要写入的内容打印到到屏幕上,而tee命令会打印到屏幕上)
tee 命令可以将输出的内容添加或者覆盖到一个文件中去-a参数代表追加,,如果被写入的文件不存在则会创建他
cat ttt.txt tee -a test.txt
echo "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" | tee -a aaa.txt




# 动态链接库的配置
# 1将其加入到环境变量中
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib
# 2.可以在/etc/ld.so.conf.d/目录下创建.conf文件来添加库路径。在默认的/etc/ld.so.conf文件中,可以看到有如下内容:
include /etc/ld.so.conf.d/*.conf
# /etc/ld.so.conf.d/目录下所有的.conf文件都被包含,文件中所有的路径都会被搜索到
touch opencv.conf
echo "/user/local/lib" > opencv.conf
echo "/usr/local/mysql/lib" >> /etc/ld.so.conf
sudo ldconfig


# 他指向/etc/ld.so.conf.d/目录下所有conf文件。这些文件有志向了具体目录,那些目录下面就是Linux系统要找的共享对象。
include /etc/ld.so.conf.d/*.conf

# ldconfig命令,单独运行ldconfig时,它只会搜索/lib、/usr/lib以及在/etc/ld.so.conf文件里所列的目录,用它们来重建/etc/ld.so.cache
# ldconfig目录名"这个命令。此命令的功能在于让ldconfig将指定目录下的动态链接库被系统共享起来,即:在缓存文件/etc/ld.so.cache中追加进指定目录下的共享库


# ldd列出可执行文件或共享库的依赖文件,这里的依赖指的是动态库
ldd libevent_openssl.so
ldd brks

# 3.在/lib和/usr/lib里面添加库文件,需要使用命令sudo ldconfig



# linux脚本捕捉选项参数通用语法
while true
do
    case "$1" in
    --pbzip2)
	COMPRESS=pbzip2
	shift
	;;
    --bzip2)
	COMPRESS=bzip2
	shift
	;;
    --gzip)
	COMPRESS=gzip
	shift
	;;
    --pigz)
    	COMPRESS=pigz
    	shift
    	;;
    --needroot)
	NEED_ROOT=y
	shift
	;;
    *)
	break
	;;
    esac
done

# makeself的下载解压
# wget https://github.com/megastep/makeself/releases/download/release-2.4.0/makeself-2.4.0.run
# chmod 755 makeself-2.4.0.run
#./makeself-2.4.0.run
# cd makeself-2.4.0
# cp *.sh /usr/local/bin/


# makeself的使用
makeself.sh 选项参数 要压缩的目录  要做成的文件名  描述信息   第一个要执行的脚本

./makeself-2.4.0/makeself.sh runbaotest  lalala.run  weihang   ./install.sh
# tar打包压缩
c:   创建文档
t: 列出存档内容
x:提取存档
f: filename 要操作的文档名
v:详细信息

打包不压缩
1.将文件打包不压缩:tar cf 打包之后的文件tar结尾(a.tar) 要打包的东西(目录)/etc/
2.列出tar包里面的文档内容:tar tf a.tar
3.提取文档内容:tar xf a.tar


对tar包压缩
z     用于gzip压缩:      filename.tar.gz
j      用于bzip压缩:      filename.tar.bz2
J      用于xz压缩:         filename.tar.xz

1.gzip压缩:tar zcf 结果文件名字(a.tar.gz) 目标tar包名字和地址(a.tar)
# tar jcf a.tar.bz2 a.tar
# tar Jcf a.tar.xz a.tar


解压tar.gz:解压tar.gz:解压tar.gz:解压tar.gz:解压tar.gz:解压tar.gz:解压tar.gz:
tar zxvf pythontab.tar.gz
tar -xjvf  httpd-2.4.4.tar.bz2
解压文件到指定文件夹: tar  xzvf  fenci.py.tar.gz  -C  pythontab/


# linux中的c有关知识
.c  是c的源码文件
.cpp 是c++的源码文件
.out是可执行文件,相当于win上的exe;
.o是编译中间目标文件,相当于win上的.obj;
.a是静态库,多个.o练链接得到,用于静态链接;
.so是共享库,用于动态链接,相当于win上.dll;
 nm是names的缩写, nm命令主要是用来列出某些文件中的符号(说白了就是一些函数和全局变量等)
 nm xxx/xxxx/xxxxxxx/xxx.out  | grep xxxxxx


vim是vi的加强版新系统需要下载
使用技巧如下


i或者a是编辑模式
esc末行模式


命令模式:
esc+:wq    保存并退出
:q!    退出
vim 文件 进入编辑文件
esc:w    保存不退出
w保存
q退出
!强制
y整行赋值
p整行粘贴
dd	删除游标所在的那一整行(常用)
ndd	n 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20(常用)
数字 + dd 多行文本删除    数字是几
退格删除
yy  整行文本复制 
p  粘贴
x 删除当前光标所在处的字符
数字  + y  多行文本复制
ctrl + v   矩形选取
: 切换到底线命令模式,以在最底一行输入命令



输入模式:
字符按键以及Shift组合,输入字符
ENTER,回车键,换行
BACK SPACE,退格键,删除光标前一个字符
DEL,删除键,删除光标后一个字符
方向键,在文本中移动光标
HOME/END,移动光标到行首/行尾
Page Up/Page Down,上/下翻页
Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
ESC,退出输入模式,切换到命令模式

G	移动到这个档案的最后一行(常用)
nG	n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20(可配合 :set nu)
gg	移动到这个档案的第一行,相当于 1G 啊! (常用)

/word	向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用)
?word	向光标之上寻找一个字符串名称为 word 的字符串。

显示行号
:set nu
:set number

关闭显示行号
set nonumber 或者 set nonu
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值