Linux 的 基础 与shell脚本的基础

时间:2022-11-14 15:35:13

1、安装vmware和创建虚拟机
2、加载centos6.5的镜像
3、linux的介绍
linux是一个操作系统(免费开源),来源unix

linux是一个典型的树形文件系统,一切都是基于文件。"/"称之linux的根目录即*目录
linux的每一个软件都有缺点的用途,最小化安装
linux中仅有一个超级用户root

linux的特点:


linux的版本:
red hat(RHEL) 收费但有免费试用版本
centos
debian
ubuntu

linux的目录结构:
/bin
/sbin
/etc
/var
/usr
/opt
/home
/root
/dev
/sys


linux中的基础命名:
command [option] [file/path]
man command

uname 显示
date 时间
hostname 主机名
ps -ef | grep pid 列出等于pid的进程
| 管道
grep 过滤
top 实时显示系统中各个进程的资源占用状况
free 显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。
jps 显示运行的java进程
kill -9 强行杀死进程
cat inittab 进入初始化界面


df 查看磁盘
fdisk / 对原有的分区进行扩容或者对整个服务器扩容
du 显示每个文件和目录的磁盘使用空间。
fsck 文件系统检查修复
mount 挂载
mkfs.ext4 格式化分区


useradd 添加用户
groupadd 添加组
gpasswd -a:添加用户到组;gpasswd -a peter users
-d:从组删除用户;
-A:指定管理员;gpasswd -A peter users
-M:指定组成员和-A的用途差不多;
-r:删除密码;
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
**********************************************************************
usermode-c<备注>:修改用户帐号的备注文字;
-d<登入目录>:修改用户登入时的目录;
-e<有效期限>:修改帐号的有效期限;
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
-g<群组>:修改用户所属的群组;
-G<群组>;修改用户所属的附加群组;
-l<帐号名称>:修改用户帐号名称;
-L:锁定用户密码,使密码无效;
-s<shell>:修改用户登入后所使用的shell;
-u<uid>:修改用户ID;
-U:解除密码锁定。
userdel 删除用户
groupdel 删除组
**********************************************************************
修改文件权限read write executable
a 超级用户、属主、其他用户
chmod ugo+-rwx /file.txt
chmod 765 /file.txt

进入目录
cd
cd - ~ $JAVA_HOME
pwd 查看当前所在目录
相对目录和绝对目录:


创建目录:
mkdir
mkdir -p ./123/1/2/3
mkdir ./123/t1 ./123/t2

创建文件
touch ./123/666 ./123/667
echo "hello world" >> ./123/668
vi ./123/669
vim ./123/669
nano ./670


列出:
ls
ll = ls -l


复制目录文件
cp ./123/666 ./123/668 ./
cp -r ./123/1 ./ 复制目录一定要 -r (改变文件属性所用的递归为R)

移动剪切重命名目录文件
mv ./123/666 ./123/668 ./123/t1/
mv ./123/1/ ./123/t1/
mv ./123/t1/668 ./123/668.doc
mv ./123/t1/1/ /home/test/123/12
mv ./123/12/ ./123/1


批量重命名目录文件
for i in `seq 2 20`; do touch /home/test/123/${i}.doc ;done
rename .doc .txt *.doc
rename .txt .doc ./123/*.txt

修改文件内容
vi ./123/666.doc
vim ./123/666.doc
nano ./123/666.doc
echo "6666" >> ./123/666.doc (追加)
echo "7777" > ./123/666.doc (覆盖)

查看文件内容
cat -n ./123/666.doc
head ./123/666.doc
head -30 /var/log/boot.log
tail /var/log/boot.log
tail -30 /var/log/boot.log
tail -f /var/log/boot.log
more /var/log/boot.log
less /var/log/boot.log

vi ./123/666.doc
vim ./123/666.doc
nano ./123/666.doc

删除目录文件
rm -rf ./666.doc
rm -rf ./1

改变文件属性
a
u g o
rwxrw-r-x
- rw- r-- r-- 2 root root 4096 Jan 1 21:00 123
d rw- --- --- 2 biman1 biman1 4096 Jan 1 21:00 biman1
d rwx r-x r-x 2 root root 4096 Jan 1 21:00 test
d rw- --- --- 2 tom tom 4096 Jan 1 21:00 tom

r 4
w 2
x 1

chomd 765 ./123

chmod -R(递归) o+w ../test/ (复制目录所用递归为r)

r 读:查看文件内容、查看目录列表、文件列表
w 写:修改文件内容、创建文件、删除
x 执行: 执行脚本文件

chown tom ./hw.sh 改变属主
chown tom:tom ./hw.sh 改变属主:组

chown -R tom:tom ./hw.sh 递归改变属主和组
chown :root ./hw.sh 改变组
chgrp tom ./hw.sh 改变组

 


编辑器:
vi ./hw.sh
i
o

esc
shift + :
w
q
wq
q!


tar:
tar -zcvf ./123.tar ./123/ 打包到123下
tar -zxvf ./123.tar 解压到当前文件夹
tar -zxvf ./123.tar -C /home/ 打包到home下

/usr/bin/zip zip打包命令
/usr/bin/unzip unzip解压命令

/bin/gzip
/bin/gunzip
gzip -cr(递归) 123 > ./123.gz

> :追加
>> :重定向

linux中的查找:
which 可执行的命令
whereis 安装包所在的目录和文件
updatedb 更新数据库
locate hw.sh 查找数据库(必须是数据库跟新后)中的关健字
按照要求查找
find / -name 'hw.sh'
find / -size
find / -atime
find / -ctime

别名:
alias
alias cle='clear'
unalias cle
分临时和永久:

cd -
cd ~
cd ./
cd ../../../

网络:
netstat -tlp 显示网络状态
(lots of)lsof -i:22 显示好多信息(-i是显示网络信息)

vi /etc/hosts
vi /etc/sysconfig/network
vi /etc/sysconfig/network-scripts/ifcfg-eth0
vi /etc/udev/rules.d/70-persistent-net.rules

service network restart/status/start/stop
service iptables restart/status/start/stop
service mysql restart/status/start/stop
service nginx restart/status/start/stop

chkconfig iptables --list
chkconfig iptables off/on


linux中软件安装:
一、二进制程序安装(**.rpm)
(利用命令使用rpm包进行安装,类似于exe安装)
优点:简单容易
缺点:对平台有限制
rpm的安装
优点:简单容易
缺点:安装包存在依赖
包的组成:
大概由五部分组成
man rpm

查询:
rpm -q
rpm -qa | grep mysql
rpm -ql
安装:
rpm -ivh /包的绝对路径
更新:
rpm -Uvh /包的绝对路径
卸载:
rpm -e --nodeps
验证:
rpm -V
二、yum的安装(联网进行安装)
查询:
yum list
yum grouplist
yum info
yum search

安装:
yum install gcc
yum -y install gcc
yum groupinstall 组包

更新:
yum -y upgrade gcc
yum -y update gcc
yum -y groupupdate 组包

卸载:
yum -y remove nc
yum -y groupremove 组包

制作缓存:
yum clean gcc
yum clean all
yum makecache

三、源码安装(**.gz)
1、下载源码并解压
2、执行源码目录下的configure文件,后面可以加参数。(读取readme文件或者下载的官网)
3、执行编译安装 make && make install

===========================shell===========================
shell:脚本语言。脚本包含一系列的可执行的linux的命令的集合

shell 解释器类别:
/bin/bash 默认
/bin/sh
/bin/tcsh
ksh 需要自己安装

执行方法:
1、 sh ./first.sh 可以不用授予执行权限
2、 授予./first.sh执行权限

 

shell中的变量:
变量名=值


注意:
变量名不能是关键字
变量名和等号 值和等号之间不能有空格
变量首字母不能是数字和特殊符号 ???

赋值:

取值:

"" :识别转移符和取值的符号
'' :不识别转移符和取值的符号,原样输出
`` :linux中的命令

设置只读变量:
readonly 变量名

删除变量:
unset 变量名

字符串的拼接:

字符的截取:
${name:1:3} 1:起始位置 3:长度

shell中注释:
单行注释
多行注释

shell中的运算:
数学运算: 借助`expr ` *需要转义
关系运算:-eq -ne -lt -le -gt -ge
逻辑运算:-a:and -o:or
字符串运算:= != -z:为0返回true -n:为0返回false str:不为空返回true
文件运算:-e:存在 -r:可读 -w(写) -x(可执行) -d(目录) -f(文件) -s(size):大小不为0返回true
布尔运算: !


shell中的数组:
基本数据类型简单,都是字符串,但是两个都是字符串的数字即可参加运算
数组定义:
arr1=(1 2 3 4 5 6 7 8)

arr2=(
1232
30
30
23
43
23
)

arr3[0]=123
arr3[3]=999
arr3[6]=[666]

赋值:
arr2[1]=9999

取值:角标从0开始,但是越界不报异常
echo ${arr1[1]}
echo ${arr1[2]}


取数组长度:
${#arr1[*]}


shell中的控制条件:
if [] ; then 控制体 ; fi
定义格式:
if []
then
控制体
fi

if []
then
控制体
else
控制体
fi

if []
then
控制体
elif []
then
控制体
else
控制体
fi

if [ $1 -eq 1 ]
then
echo "男"
fi


if [ $1 -eq 1 ]
then
echo "男"
elif [ $1 -eq 2 ]
then
echo "女"
else
echo "泰国"
fi

有if的地方,后面就有then
没有elseif 只有elif
每一个控制体都必须写
if 和 中括号之间的空格必须严格遵守

shell中的循环:
定义:
for i in 循环条件
do
循环体
done

while 循环条件
do
循环体
done

until [控制体] 满足条件跳出循环
do
循环体
done

循环
(1)for循环
for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done
(2)while循环
i=1
while(i < 11)
do
echo $i
let i++
done
(3)until循环
startDate=
endDate=
until [ $# -eq 0 ]
do
if [ $1'x' = '-sdx' ]
then
shift
startDate=$1
elif [ $1'x' = '-edx' ]
then
shift
endDate=$1
fi
shift
done

continue:调出当次循环
break:调出循环

case 值 in(类似于switch)
(匹配值)
语句
;;
(匹配值)
语句
;;
esac
循环 switch break continue
while :
do
echo "输入1-5"
read num 键盘输入
case $num in
1|2|3|4|5)
echo "在1-5之间"
break
;;
*)
echo "在6-10之间"
continue
;;
esac
done

方法无参无返回值
#!/bin/bash

function fuck(){
echo "第1个参数"$1
echo "第2个参数"$2
echo "第3个参数"$3
echo "第4个参数"$4
echo "第10个参数"${10} #参数个数超过9个之后参数取值要加{}
echo "第所有参数"$*
echo "参数个数 "$#
}
fuck 1 2 3 4 5 6 7 11 22 33 44

方法无参有返回值
#!/bin/bash

function fuck(){
echo "第一个参数:"
read anum
echo "第2个参数:"
read bnum
return $(($anum+$bnum))
}
fuck
echo $? #返回值不能超过255

$1去参数 $#取个数 $* $@ 取所有个数 $?取返回值

shell中的文件引入
#!/bin/bash
#source /home/shell/1.sh #第一种
. /home/shell/1.sh #第二种
echo ${name}
echo "aaaaaaa"
func

shell的简单调试
语法检测:相当于java的编译
1、shell语法检测:
sh -n ./test.sh (sh是/bin/sh 是系统提供的可执行脚本)
2、shell的普通调试:
sh -x ./test.sh
3、在调试过程中可以按Ctrl + Z中断调试,观察结果,然后再按fg键继续调试即可。(先按f在按g键)

shell中的时间
years weeks days hours minutes seconds
echo `date -d "x days ago" "+%Y-%m-%d %H:%M:%S"`
x大于0 为 之前 x小于0 为之后

crontab -e(定时列表编辑)
* * * * * 可执行的命令与脚本
分时天月周
00 2-4 * * * 凌晨两点到四点(2,4)两点和四点
00 */4 * * * 每两个小时跑一次
*/1 * * * * 每一分钟跑一次 echo "hello" >> ./home/cronttab.log

sudo 让普通用户得到root权限
前提是先修改sudo的文件 /etc/sudoers 添加普通用户
root用户不能修改sudo文件,需要修改文件权限后编辑 chmod a+w
sudo rm -rf 1.sh (此时需要输入密码)
不输入密码重新修改sudo文件 nopass

 

 

//修改后缀名待修改
#!/bin/bash
#read dir
#function ff(){
dir=/home/abc
cd $dir
for file in 'ls $dir'
do
name=$(ls $file | cut -d . -f1)
mv $file ${name}
done
#}
#ff

=====================================
#!/bin/bash

basedir=/home/shell
rename .sh .txt *.sh
=============有两个.sh=============
#!/bin/bash

basedir=/home/shell
rename .sh .txt $basedir/*.sh
==============定时删除一周前的日志================
oneweekago=date -d "1 weeks ago" "+%Y-%m-%d"
pwatimestamp=echo `date -d "1 weeks ago" "+%s"`#时间戳
#代码
#!/bin/bash
logdir='/home/logs'
pwatimestamp=echo `date -d "1 weeks ago" "+%s"`#时间戳
for i in `ls $logdir`
do
logdate=`basename $i .log`
ldtimestamp=`date -d "$logdate" "+%s"`
if [ $ldtimestamp -le $pwatimestamp ]
then
rm -rf ${logdir}$i
fi
done