欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux基础+Shell编程

程序员文章站 2022-03-04 18:59:58
...

Linux基础

一、Linux目录结构

/bin:存放必要的命令、标准系统实用程序、增加的用户程序。

/boot:存放启动Linux时使用的一些核心文件、内核。

/dev:存放设备文件。

/etc:存放设置文件、系统管理所需要的配置文件和子目录。

/home:用户文件的主目录,存放用户数据。

/lib:存放系统最基本的动态链接共享库、必要的运行库。

/lost+found:存放系统意外关机时未保存的文件。

/media: linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。

/mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

/opt:这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

/proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。

/root:该目录为系统管理员,也称作超级权限者的用户主目录。

/sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

/selinux:这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

/srv:该目录存放一些服务启动之后需要提取的数据。

/sys:这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

/tmp:这个目录是用来存放一些临时文件的。

/usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。

/usr/bin:系统用户使用的应用程序。

/usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。

/usr/src:内核源代码默认的放置目录。

/var:这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

/run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

二、Linux常用命令

Linux常用命令
pwd 查看当前所在的目录
date 查看当前系统时间
who 查看当前在线 (whoami查看当前登录的用户)
last 查看最近的登录历史
ls / 查看根目录下的所有内容
ls -l 以列表的方式展示 -a 显示隐藏文件 -h 显示文件大小
cd cd~进入用户根目录
cd -回到原来路径
cd …去上一层目录

创建文件夹
mkdir abc 相对路径的写法
mkdir -p aaa/bbb/ccc 可以创建多层文件
mkdir /data 绝对路径的写法

删除文件夹
rmdir 可以删除空目录
rm -r aaa 可以把整个文件夹以及其中所有的子节点删除。(带有删除提示)
注意:r表示递归。(recursion)
rm -rf aaa 强制删除(无提示)

修改文件夹名称
mv aaa hhh 修改文件名称
mv file.1 /data/hello.1 移动文件到指定目录并修改文件名

创建文件
touch file.1 创建一个空文件
echo “hello linux …” > file.1 利用重定向将输出内容写入到file.1文件中
echo “bye,bye!” >> file.1 将指定内容重定向到目标,不覆盖原有内容。>会覆盖文件原有内容,>> 在文件原有内容的基础上进行追加

可以使用cat 命令查看文件内容。
head file.1 查看文本 默认显示前十行 tail 默认显示后十行 more 全部显示
cp a.txt /etc/b.txt拷贝并改名

find查找文件
1.按照文件名进行查找
(1)find / -name httpd.conf  #在根目录下查找文件httpd.conf,表示在整个硬盘查找 (2)find /etc -name httpd.conf  #在/etc目录下文件httpd.conf
(3)find /etc -name ‘srm’  #使用通配符*(0或者任意多个)。表示在/etc目录下查找文件名中含有字符串‘srm’的文件
(4)find -name ‘srm*’   #表示当前目录下查找文件名开头是字符串‘srm’的文件
2.按照文件特征查找     
(1)find / -amin -10   # 查找在系统中最后10分钟访问的文件(access time)
(2)find / -atime -2   # 查找在系统中最后48小时访问的文件
(3)find / -empty   # 查找在系统中为空的文件或者文件夹
(4)find / -group cat   # 查找在系统中属于 group为cat的文件
(5)find / -mmin -5   # 查找在系统中最后5分钟里修改过的文件(modify time)
(6)find / -mtime -1   #查找在系统中最后24小时里修改过的文件
(7)find / -user fred   #查找在系统中属于fred这个用户的文件
(8)find / -size +10000c  #查找出大于10000000字节的文件(c:字节,w:双字,k:KB,M:MB,G:GB)
(9)find / -size -1000k   #查找出小于1000KB的文件
whereis ls 查找命令在哪一个目录下 同which

压缩与解压
1.不保留原文件
gzip abc 对文件进行压缩为.gz后缀名压缩文件
gunzip abc.gz 对压缩文件进行解压 同gzip -d abc.gz
2.保留源文件
tar -czvf file1.tar.gz file1将file1文件压缩为后缀名为.tar.gz的文件
tar -xzvf file1.tar.gz 解压

使用vi创建文件
vi file.3
1.一般模式:只接受快捷键,进入vi编辑器的默认模式。
gg:直接跳到首行
G:直接跳到尾行
i:进入编辑模式
a:在光标的后一位开始插入
A:在该行的最后插入
dd:删除当前行 3dd 一次删除光标后3行
yy:复制当前行 3yy 一次复制3行
p:进行粘贴
v Ctrl+v Shift+v:分别对应字符模式,块模式,行模式。该模式下y复制,p粘贴
2.编辑模式:Esc退出编辑模式回到一般模式。
3.底行模式 : 输入: 表示进入底行模式。
%s/haha/sbsbsb:查到所有haha字符并替换成sbsbsb
/指定内容:直接查找到指定内容
:wq保存文件并退出vi
:wq!强制保存文件,并退出vi
:q!强制退出
:e!放弃所有修改,从上次保存文件开始再编辑

5.文件权限操作
权限解读:drwxr-xr-x
d:标识节点类型(d:文件夹 -:文件 l:链接)
r:可读 w:可写 x:可执行
第一组rwx: 表示这个文件的拥有者对它的权限
第二组rwx: 表示这个文件的所属组对它的权限
第三组rwx: 表示这个文件的其他用户(相对于上面两类用户)对它的权限
修改权限rwx
u代表自己 ug代表同一组 o代表其他人 a代表所有人
+代表增加权限 -代表去掉权限 =代表赋予权限
chmod u+w,ug-x,o+r a.txt
chmod a=wx a.txt 则权限为-wx-wx-wx
chmod -R a+r * 为当前目录下的所有文件与子目录同时设置权限
chown users:jessie a.txt 将文件的用户拥有者设为users,组的拥有者设为root

6.基本用户管理
1、添加用户
useradd 用户名
passwd 用户名
2、用户的切换  
su 用户名 切换成指定用户
sudo 执行当前命令的时候使用root权限
权限配置的文件在/etc/sudoers文件中
3、主机名称
hostname 查看主机名称
/etc/sysconfig/network 可以永久修改主机名称
4、IP地址修改
ifconfig 查看ip信息
/etc/sysconfig/network-scripts/ifcfg-eth0
service network restart 重启网络配置

8.查看文件大小
stat a.txt 查看文件详情
du -s /opt 查看汇总之后的文件大小
du -sh /opt 查看汇总之后的人能看懂的。(带单位)而不是显示当前文件在linux文件系统中占多少元数据
9.查看分区大小
df -h 查看分区使用情况

10.关机,重启
halt 关机 reboot 重启

三、JDK安装

1、解压缩文件

### 1.使用tar -zxvf JDK安装包,命令解压缩文件. -C

2、配置环境变量

​ vi /ect/profile

​ 加入如下代码。

export JAVA_HOME=/opt/jdk1.7.0_79
export PATH=$PATH:$JAVA_HOME/bin

​ 重新加载配置文件

​ source /etc/profile

​ reboot之后永久生效。

Shell编程

一、变量

1.变量可以被重新定义

2.使用readonly可以将变量定义为只读

3.unset可以删除变量 不能删除只读变量

myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
unset myUrl

二、字符串

1.单引号里的任何字符都会原样输出 单引号字符串中的变量是无效的

2.单引号字符串中不能出现单个引号 但可成对出现作为拼接字符

3.双引号里可以出现转义字符

your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

输出结果为

Hello, I know you are "runoob"! 

1、拼接字符串

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

输出结果为

hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

2、获取字符串长度

string="abcd"
echo ${#string} #输出 4

3、提取子字符串

#参数1表示从索引1处开始提取 参数4表示截取4个字符
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

4、查找子字符串

#查找字符i或o最先出现的位置
string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

三、数组

1、创建数组

array_name=(value0 value1 value2 value3)
:<<!
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
可以不使用连续的下标,而且下标的范围没有限制。
!

2、读取数组

#使用 @ 符号可以获取数组中的所有元素
echo ${array_name[@]}

3、获取数组长度

#*或@都可以
echo ${#array_name[*]}

4、获取数组单个元素长度

echo ${#array_name[n]}

四、传递参数

#$0为执行的文件名 $n为第n个参数
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "传递到脚本的参数个数:$#";
#使用""将$*括起来传的参数等价于一个参数"a b c"
#使用""将[email protected]括起来传的参数等价于三个参数"a""b""c"
echo "显示所有向脚本传递的参数:"$*"";
echo "脚本运行的当前进程ID号:$$";
echo "后台运行的最后一个进程的ID号:$!";
echo "显示shell使用的当前选项:$-";
echo "显示最后命令的退出状态0表示无错误:$?";

五、运算符

1.expr是一款表达式计算工具

2.表达式和运算符之间必须要有空格

3.完整的表达式要被``包含而不是单引号

val=`expr 2 + 2`
echo "两数之和为 : $val"

1、算术运算符

a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
#乘号做运算时需在前边加上\
val=`expr $a \* $b`
echo "a * b : $val"
#a/b结果为0
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
#if与括号与变量间全都要加上空格
if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

2、关系运算符

:<<EOF
-eq:检测两个数是否相等,相等返回 true
-ne:检测两个数是否不相等,不相等返回 true
-gt:检测左边的数是否大于右边的
-lt:检测左边的数是否小于右边的
-ge:检测左边的数是否大于等于右边的
-le:检测左边的数是否小于等于右边的
EOF
a=10
b=20
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi

3、逻辑运算符

#-O 逻辑或运算 || 短路或
#-a 逻辑与运算 && 短路与
a=10
b=20
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

4、字符串运算符

:<<EOF
=检测字符串是否相等 !=
-z检测字符串长度是否为0 为0返回true
-n长度不为0返回true
$ 检测字符串是否为空 不为空返回true
EOF
a="abc"
b="efg"
if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi

5、文件测试运算符

:<<!
文件测试运算符
-b 检测文件是否是块设备文件
-c 检测文件是否是字符设备文件
-d 检测文件是否是目录
-f 检测文件是否是普通文件
-g 检测文件是否设置了SGID位
-k 检测文件是否设置了粘着位
-p 检测文件是否是有名管道
-u 检测文件是否设置了SUID位
-r 检测文件是否可读
-w 检测文件是否可写
-x 检测文件是否可执行
-s 检测文件是否为空 不为空返回true
-e 检测文件(包括目录)是否存在
!
file="/root/桌面/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi
if [ -w $file ]
then
   echo "文件可写"
else
   echo "文件不可写"
fi
if [ -x $file ]
then
   echo "文件可执行"
else
   echo "文件不可执行"
fi
if [ -f $file ]
then
   echo "文件为普通文件"
else
   echo "文件为特殊文件"
fi
if [ -d $file ]
then
   echo "文件是个目录"
else
   echo "文件不是个目录"
fi
if [ -s $file ]
then
   echo "文件不为空"
else
   echo "文件为空"
fi
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

六、echo命令

#最外层双引号可以省略
echo \"It is a test\"
#read命令从标准输入中读取一行 并把每个字段的值指定给shell变量
#-p输入提示文字 -n输入字符长度限制 -t输入限时 -s隐藏输入内容
read -p "请输入一段文字" -n 6 name
echo "$name It is a test"
#-e开启转义 -n换行 -c不换行
echo -e "OK! \n"
echo "It is a test"
#命令使用``
echo `date`

七、printf命令

:<<!
转义序列
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 不显示输出结果中任何结尾的换行字符
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符,仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符
!
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 
# format-string为双引号
printf "%d %s\n" 1 "abc"
# 单引号与双引号效果一样 
printf '%d %s\n' 1 "abc" 
# 没有引号也可以输出
printf %s abcdef
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n" 

八、test命令

​ 用于检查某个条件是否成立,可以进行数值、字符和文件三个方面的测试。

1、数值测试

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

2、字符串测试

num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

3、文件测试

if test -e ./notFile -o -e ./bash
then
    echo '至少有一个文件存在!'
else
    echo '两个文件都不存在'
fi

九、流程控制

1、if语句

a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

2、for循环

​ 当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。in列表是可选的,如果不用它,for循环使用命令行的位置参数。

#一般格式
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
#写成一行
for var in item1 item2 ... itemN; do command1; command2… done;

3、while语句

​ while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。

int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

4、until循环

1.until 循环执行一系列命令直至条件为 true 时停止。

2.until 循环与 while 循环在处理方式上刚好相反。

3.一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

5、case

​ case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

6、跳出循环

​ 在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。

  • break 允许跳出所有循环
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done
  • continue 跳出当前循环,继续下次循环
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done

十、函数

shell 可以用户定义函数,然后在shell脚本中可以随便调用。

​ 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

​ 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
相关标签: Linux Shell