Linux系统结构与shell脚本的变量,判断语句if else/case in,循环语句for while和shell函数

Linux系统结构

命令
shell
shell脚本
程序
library
kernel
systemcalls
hardware

kernel

Linux是宏内核操作系统(所有的操作交给内核去执行),内核的系统调用负责:

管理项目具体内容
文件系统管理不同的文件系统之间的数据交互
网络管理进程之间的通信
进程管理管理不同进程之间的调度
内存管理管理着虚拟内存和物理内存之间的映射
硬件管理控制着不同设备之间的运转

shell

shell是一个命令行解释器,命令行提示符输入了字符串之后,shell会告诉内核去PATH中的文件夹里找和字符串相同的可执行文件。如果文件存在执行对应的文件的操作,如果不存在命令错误。

Ubuntu一般采用bash解释器

Linux文件类型

标志类型
-普通文件
d目录文件
l链接文件
b块设备文件
c字符设备文件
p管道文件
s套接字文件

常用shell命令

命令 选项 参数

用户

sudo #以超级用户执行一次命令
su   #进入超级用户

sudo adduser username #添加用户

cat /etc/passwd # 查看用户是否添加成功

sudo deluser username #删除用户,残留用户文件夹
sudo rm -rf /home/username #删除用户文件夹

sudo deluser --remove-home username #删除用户及文件夹

输入输出

read #输入
echo #输出

输出重定向

将本来输出到终端的内容重定向至文件

命令行 > 目标文件 #输出将覆盖目标文件原内容
命令行 >> 目标文件 #将输出追加在目标文件原内容之后
>/>>2>/2>>&>/&>>
只能重定向正确的输出只能重定向正确的输出正确和错误都可重定向

>若只出现错误输出,则清空目标文件。
2>若只出现正确输出,则清空目标文件。

输入输出转义

形式作用
无引号正常输出$中的内容,空格只输出一个,单个\不输出
单引号’’原样输出引号中的内容,不做任何修改
双引号""\会转义,$中的内容

文件类命令

通配符

通配符匹配内容
*任意长度内容
?几个?就几个字符内容
[a-z]匹配a-z中任意一个单独数字的内容
[anx]anx各位数字为单独个体,只能匹配单独数字的相同内容
[^anx]匹配除了anx中出现的单独数字之外的其他单独数字文件

显示路径下文件,到达路径,创建删除文件

ls
ls -l #显示当前路径下文件以及属性
ls -a #显示当前路径下所有文件包括.开头的隐藏文件

cd    #到家目录
cd .. #返回上一级目录
cd 绝对路径 
cd - #返回上一操作目录

touch 文件名 目标路径
mkdir 文件夹名 目标路径

rm
rm -r #递归删除文件夹
rmdir #删除空文件夹

cp 文件名 目标路径
mv 文件名 目标路径

权限

Linux文件权限授权对象为UGO,即user,group,other。每个对象又有r(读)w(写)x(执行)三项权限。

所以每一个对象的三个项权限可以表示为三位二进制即:

000~111,转换为八进制就是0~7。

三个对象就是三位八进制数:

000~777

在家目录文件下,默认权限为664,即777的满权限减去文件掩码umask,之后十进制每一位逢奇数减1,逢偶数不变。

777-002=775-111=664

Linux更改文件权限有两种命令方式:

chmod u+w filename #授权对象+权限种类 文件名
chmod ddd filename #授权三位八进制数 文件名

打包

tar -选项 包名 被打包文件
tar -选项 包名 -C 解包输出路径

tar选项:

选项功能内容
c打包
x解包
f指定文件
v可视化
z指定工具gzip,包后缀.tar.gz
j指定工具bzip2,包后缀.tar.bz2

以上选项在命令行中组合使用。

文件查找

find 路径 文件名

查看内容

cat  #输出文件内容到终端
head #从头输出,默认十行
head -n #从头输出n行
tail #从尾输出,默认十行
tail -n #从尾输出n行
more #按照百分比格式显示文件
less #默认终端当作文件的显示器,按q退出模式

内容查找

grep -选项 指定内容 文件名

grep选项:

选项功能内容
n查找指定文件中指定内容
v查找指定文件中指定内容以外的内容
c统计指定文件中指定内容出现的行数

链接文件

在链接有效时(此时指的是链接有效,并非链接文件是否能够打开/链接文件是否有效)改动链接文件内容,源文件内容与其他关联链接文件内容随之改变,改动源文件内容同理。

ln -s 源文件内容/目录 目标文件/目录 #软链接
ln 源文件内容/目录 目标文件/目录 #硬链接

软硬连接特性:

链接类型本质与源文件的大小和权限链接文件移动后源文件删除后删除后再创新源文件
绝对路径软链接快捷方式,存储源文件绝对路径权限大小不同于源文件有效无效与新源文件相同
相对路径软连接快捷方式,存储源文件相对路径权限大小不同于源文件无效无效与新源文件相同
绝对路径硬链接文件复制权限大小与源文件相同有效有效与创建链接文件时的的源文件相同
相对路径硬链接文件复制权限大小与源文件相同有效有效与创建链接文件时的的源文件相同

文件计数

wc 文件名
#  文件行数 单词数 字符数

管道与参数提前

命令行a | 命令行B #管道
命令行b `命令行a` #参数提前

如以上例子:
管道指的是将前一个命令行a的标准输出通过管道转为下一个命令行b的标准输入。
参数提前与管道相同,将``中命令行a的输出变为``外命令行b的参数。

xargs

xargs可以将字符串转换为命令行参数,并且带有echo多行转一行的特性

find *c|xargs grep -n “int”

该例子表示将find找到的所有.c文件文件名转换为下一个命令行里需要输入文件名的参数。

shell脚本

shell脚本时shell语句的集合,所以shell命令如何写shell脚本就如何写。c是强类型语言,shell是弱类型语言。

如何创建能够运行的shell脚本:
①创建.sh文件
②写shell脚本
③给脚本文件加上可执行权限
④./脚本名

shell脚本第一行是:

#! 解释器所在路径

shell变量

普通变量的定义和赋值

直接定义变量并赋值:

a=100
echo $a #输出a中的内容,如不带$,则直接输出a。

从命令中读取参数并赋值给变量:

read a
echo $a

位置变量

将输入的命令行当作一个字符类型的指针数组

echo $n #意思就是打印输入命令的第n个字符串。

系统预定义变量

变量功能
$@显示命令除了可执行文件以外的命令
$*和$@一样
$#统计除了执行文件之外的其他内容的个数
$?返回上一行代码的退出状态,而不是脚本的状态

环境变量

env #显示环境变量
export PATH=$PATH:需要加入环境变量的路径 #临时更改环境变量

临时改变环境变量指的是在当前终端窗口下有效。如果需要永久改变环境变量,那么需要在~/.bashrc文件中加入export更改环境变量语句。

shell语句

计算语句

!注意空格

expr number1 + number2
expr number1 - number2
expr number1 \* number2
expr number1 / number2

空间语句

seq 首数 尾数

表示首数尾数间的整数序列

测试语句

!注意空格

test n1 选项 n2
[ n1 选项 n2 ]

整型测试选项

选项功能
n1 -gt n2数1是否大于数2
n1 -lt n2数1是否小于数2
n1 -ge n2数1是否大于等于数2
n1 -le n2数1是否小于等于数2
n1 -eq n2数1是否等于数2

字符串测试选项

选项功能
str1 = str2字符串1是否等于字符串2
str1 != str2字符串1是否不等于字符串2
-z str字符串是否为零
-n str字符串是否不为零

文件属性测试选项

选项功能
-r file是否具有可读权限
-w file是否具有可写权限
-x file是否具有可执行权限
-f file是否为普通文件
-d file是否为目录文件
-l file是否为链接文件
file1 -filet file2是否file1比file2新
file1 -ot file2是否file1比file2旧
-s文件是否为零

选择判断语句

if else

例子:

判断文件如是普通文件输出内容,如是目录文件输出目录中的文件,都不是打印“noting”。

#! /bin/bash

read file
if [ -f $file ]
then
	cat $file
elif [ -d file ]
then
	ls $file
else
	echo nothing
fi
case in

例子:
输入1/2/3则输出1/2/3,输入其他则输出“*”。

#! /bin/sh

read a
case $a in
	1)
		echo 1
		;;
	2)
		echo 2
		;;
	3)
		echo 3
		;;
	*)
		echo '*'
		;;
esac

注意:不同于C语言中的switch case,case in型语句每一个选项都会默认break。

循环语句

for循环

依次输出num1到num2之间的整数,包含num1与num2本身。

#! /bin/bash

read num1 num2
for i in `seq $num1 $num2`
do
	echo $i
done
while循环

例子:
一直打印a

while true
do
    echo a
done

shell函数

函数名(){
    命令表
}

拾遗之cat命令

经过实践可知,shell命令中的cat命令无法封装为函数,若封装为函数会出现段错误。

#! /bin/bash

read file1 file2
sta(){
    echo `wc $file1`
    echo `wc $file2`
}
#cat(){
#}
connect(){
    cat $file1 >>$file2
}
cp(){
    cat $file1 >$file2
}

if [ -f $file1 ] && [ -f $file2 ]
then
    while true
    do
        read sel
        case $sel in
            "sta")sta $file1 $file2
                ;;
            "cat")cat $file1
                cat $file2
                ;;
            "connect")connect $file1 $file2
                ;;
            "cp")cp $file1 $file2
                ;;
            *) break
            ;;
        esac 
    done
else
    echo err
fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值