老姜上课讲过的Linux Shell编程

文章目录

不知道考不考东西


前置内容

  • Linux属于网络操作系统
  • 开源
  • Linux是在GPL协议下发行的遵循POSIX标准的操作系统内核

Linux体系架构

  1. Linux 内核
  2. Linux Shell
  3. Linux 文件系统
  4. Linux 应用程序

Linux系统特点

Linux源于Unix

  1. 开放性
  2. 多任务和多用户
  3. 支持多种硬件平台
  4. 可靠的安全系统
  5. 良好的用户界面
  6. 强大的网络功能
  7. 设备独立
  8. 支持多种文件系统
  9. 良好的可移植性

Linux的发行版本

  1. Red Hat (红帽)
  2. CentOS
  3. Ubuntu
  4. ……

Linux 课堂知识点

  1. vim的3种工作模式:
    1. 命令模式
    2. 插入模式
    3. 末行模式
  2. 前一个命令的标准输出作为后一个命令的标准输入:
    • 管道
  3. IPV4地址由( )二进制位数组成:
    • 32位
  4. 条件表达式与[ ]之间两边都要有:
    • 空格 (如:if [ $1 -eq 0 ])
  5. 快速切换到家目录的命令:
    • cd ~
  6. 两种路径:
    1. 相对路径 (“…/”表示当前所在目录的上一级目录;“./”表示当前所在目录;”.“和”…“只会在相对路径中出现)
    2. 绝对路径
  7. 统计文件中内容(如字符的个数、单词的个数等)的命令:
    • wc
  8. 确定是否安装了apache服务(对应httpd),查看的命令:
    • rpm -qa | grep httpd
  9. Linux结束进程的命令:
    • kill
  10. 用数字635表示的权限对应的字母表示形式:
    • rw-,-wx,r-x
  11. Linux有哪些用户:
    1. root用户(超级用户):ID为0,拥有最高权限
    2. 系统用户:CentOS7中ID为1~999
    3. 普通用户:CentOS7中ID为1000以上
  12. Linux以( )方式访问设备:
    • 文件 (Linux中一切皆文件)
  13. 唯一标识用户的是:
    • uid
  14. 某文件的组外成员权限为只读,所有者有全部权限,组内权限为读写,用数字表示:
    • 764
  15. 在CentOS7种如果使用匿名用户登录ftp: ?
    • 匿名用户名:anonymous
  16. 在给定文件中查找预设定条件符合的字符串的命令:
    • grep
  17. smb服务器服务配置文件:
    • smb.conf
  18. ftp服务器服务配置文件:
    • vsftpd.conf
  19. 在CentOS7中启动某一个一个服务:
    • systemctl start 什么什么.service 启动
    • systemctl restart 什么什么.service 重启/刷新
    • systemctl stop 什么什么.service 停止
  20. 启动ftp服务的命令、启动dns服务的命令、启动samba服务的命令:
    • systemctl start vsftpd.service
    • systemctl start named.service
    • systemctl start smb.service
  21. dns作用:
    • 把域名解析为IP地址
  22. dhcp作用:
    • 为客户及分配IP地址
  23. ftp的配置文件(想修改ftp):
    • vsftpd.conf
  24. Linux文件系统的文件,对于外部文件一般放在( )目录中:
    • /dev
  25. Linux文件系统的文件,对于配置文件一般放在( )目录中:
    • /etc
  26. vim编辑器在末行模式下保存退出的命令:
    • wq
  27. 普通用户切换到超级用户:
    • su root
  28. Linux的内核管理包括:
    1. 内存管理器
    2. 进程管理器
    3. 设备驱动程序
    4. 虚拟文件系统
    5. 网络管理
  29. ( )文件保存用户的uid信息:
    • /etc/passwd
  30. 命令ls t*.?代表的意义:
    • 查看文件名以t开头,扩展名值为一个字符的文件
  31. 查找以#开头的文件名的命令:
    • find
  32. useradd命令指定主目录的参数:
    • -d
  33. root组群默认的组号:
    • 0
  34. Linux系统的各部分组成中,最核心、最基础的部分:
    • 内核
  35. Linux操作系统的主要具有的特点:
    1. 开放性
    2. 多任务和多用户
    3. 支持多种硬件平台
    4. 可靠的安全系统
    5. 良好的用户界面
    6. 强大的网络功能
    7. 设备独立
    8. 支持多种文件系统
    9. 良好的可执行性
  36. Linux系统的核心模块:
    • Linux文件系统 (在Linux中,任何软件和I/O设备都被视为文件)
  37. 引导目录,主要防止开机时会使用到的文档的目录:
    • /boot
  38. 家目录,即用户的主目录的目录:
    • /home
  39. 系统存放程序的目录:
    • /usr
  40. 查看“当前工作目录”的完整路径的命令:
    • pwd
  41. 文件名称:
    • 最多可以使用25个字符,除了正斜线“/”外,都是有效字符
  42. Linux是一个多用户多任务的操作系统,可以同时执行多个用户的多个程序
  43. 进程,是一个具有一定独立功能的程序或程序段在一组数据集合上的一次动态执行过程,同时也是程序能够并发执行的基础机制

Linux 命令

  1. 启动Linux系统,进入默认的目录(/home),在当前的路径下,添加新用户 student,并设置该用户的登录密码

    cd /home
    useradd student
    passwd student

  2. 在用户 s 下创建两个新目录 d1、d2,然后将 d2 目录移动到 d1 目录中,再删除 d2 目录

    mkdir d1 d2
    mv d2 d1
    cd d1
    rm -rf d2

  3. 创建用户 d1,设置用户主目录为根下的 d1,密码为空,且其附加组群为 t

    useradd -d /d1
    groupadd t
    usermod -g t d1

  4. 配置网卡 e0 的IP地址为 192.168.1.1,子网掩码为 255.255.255.0

    ifconfig 192.168.1.1
    netmask 255.255.255.0

  5. 修改 student.txt 的所有者权限为读写许可,其他用户只能进行只读访问

    chmod u+r+w,o+r student.txt 或者 chmod 644 student.txt

  6. 增加两个组账号 g1 和 g2 并制定主账号 ID 分别为 2002 2003,增加两个用户账号 u1(UID 为 2047 并属于组 g1) u2(UID 为 2048 并属于组 g2)

    groupadd -g 2002 g1
    groupadd -g 2003 g2
    useradd -u 2047 -g g1 u1
    useradd -u 2048 -g g2 u2

  7. 在当前用户的家目录下创建名为 test1 的目录,并 test1 目录下 创建文件 ,向 gs.txt 输入内容 Hello Worldgs.txt

    cd ~
    mkdir test1
    cd test1
    touch gs.txt
    echo Hello World > gs.txt

  8. 在用户 t1 个人目录下已有目录 test,完成以下要求的操作:
    搜索路径 /etc 下所有以 p 开头的文件和目录,拷贝到 test 中,把目录 test 下所有内容建立 tar 包,并命名为 test.tar.gz

    cp -r /etc/p*.* /home/t1/test
    tar -zcvf test.tar.gz /home/test/*

  9. 已在当前目录创建新文件 p 完成以下要求的的操作:
    查看文件的读写执行权限,并指定文件的所有者拥有读、写、执行三种权限

    ll
    chmod u+r+w+x p

  10. 在当前目录下新建一个目录 t,在 t 下新建两个文件 t1 和 t2,把 t2 移动到其父目录中,并改名为 f2

    mkdir t
    cd t
    touch t1 t2
    mv t2 …/f2


Linux Shell编程(课堂给出)

用户从键盘输入一个文件名,判断这一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下

#!/bin/bash

read file

if [ -f $file ]
then
	cp ./$file /dev
fi

定义函数 mul 用于计算两个参数的积,并在程序中调用此函数,计算从键盘动态输入的两个参数的积

#!/bin/bash
mul() {
	echo "$1*$2=$[$1*$2]"
}

read m
read n

mul $m $n

编写shell程序,实现自动删除20个账号的功能,账号为 u1——u20

#!/bin/bash

i=1
while [ $i -le 20 ]
do
	userdel -r u{$i}
	let i++
done

用户从键盘输入一个正整数N,变成统计从1加到N的值

#!/bin/bash

read n
sum=0

for (( i=0;i<=n;i++ ))
do
	sum=$[$sum+$i]
done

echo "从1加到$n的和为$sum"

编写一个shell程序,实现对成绩的等级判断,成绩以参数的形式输入,如果输入的参数大于等于90输出优秀,大于等于80输出良好,大于等于70输出中等,大于等于60输出及格,否则不及格

#!/bin/bash

if [ $1 -ge 90 ]
then
        echo "优秀"
elif [ $1 -ge 80 ]
then
        echo "良好"
elif [ $1 -ge 70 ]
then
        echo "中等"
elif [ $1 -ge 60 ]
then
        echo "及格"
else
        echo "不及格"
fi

编写一个程序,输入1输出周一,输入2输出周二,输入其他数字输出other,使用case语句

#!/bin/bash

case $1 n
1)
	echo "周一"
	;;
2)
	echo "周二"
	;;
*)
	echo "other"
esac

从键盘输入一个数,若大于0则输出该数,若小于等于0,则输出零值

#!/bin/bash

read n

if [ $n -gt 0 ]
then
	echo $n
else
	echo 0
fi

编写一个名为m的shell程序,格式为m <y> <f>,如果y不存在给出提示,否则将y移至f中

#!/bin/bash

if [ -f $y ]
then
	mv $y $f
else
	echo "不存在"
fi

输出斐波那契数列的前20个数

#!/bin/bash

t1=1
t2=1

echo $t1
echo $t2

for (( i=3;i<=20;i++ ))
do
	t3=$[$t1+$t2]
	t1=$t2
	$t2=$t3
	
	echo "$t3 "
done

Linux Shell编程(可忽略)

  • 对于shell编程的文件我们通常在终端中使用命令vim file_name.sh创建
  • 执行sh文件有两种方式,一种是用路径直接调用,如当调用前路径下的demo.sh即,./demo.sh(需要注意的是,这种方法需要这个文件的拥有者有执行权限,我们通常通过ll命令查看权限,使用chmod u+x file_name.sh命令加入执行权限);另外一种便是sh file_name.sh命令,我们通常选用后者

定义变量和静态变量赋值并输出的程序

# 定义变量和静态变量赋值并输出的程序
vim test.sh

#!/bin/bash

a=200
echo $a
unset a		# 撤销变量a

readonly B=100
echo $B
unset B		# 这条语句会报错,静态变量不可撤销

命令行传参做两个数的加法

# 定义变量和静态变量赋值并输出的程序
vim test.sh

#!/bin/bash

res=$[$1+$2]

echo "$1+$2=$res"

sh test.sh 2 6
2+6=8

命令行传参判断两字符串是否相等

# 命令行传参判断两字符串是否相等
vim test.sh

#!/bin/bash

if [ $! = $2 ]
then
	echo "这两个字符串相等"
else
	echo "这两个字符串不相等"
fi

sh test.sh abc abc
这两个字符串相等
sh test.sh abc ABC
这两个字符串不相等

命令行传参判断一个数是否小于零

# 命令行传参判断一个数是否小于零
vim test.sh

#!/bin/bash

if [ $1 -lt 0 ]
then
	echo "$1小于0"
else
	echo "$1大于等于0"
fi

sh test.sh -2
-3小于0
sh test.sh 6
6大于等于0

命令行传参判断一个成绩是什么水平

# 命令行传参判断一个成绩是什么水平
vim test.sh

#!/bin/bash

if [  $1 -lt 0 || $1 -gt 100 ]
then
	echo "请输入百分制成绩"
else if [ $1 -ge 90 ]
then
	echo "优秀"
else if [ $1 -ge 80 ]
then 
	echo "良好"
else if [ $1 -ge 90 ]
then
	echo "优秀"
else if [ $1 -ge 70 ]
then 
	echo "中等"
else if [ $1 -ge 60 ]
then
	echo "及格"
else 
	echo "不及格"
fi

sh test.sh 96
优秀

命令行传参一个数字打印对应的星期

# 命令行传参一个数字打印对应的星期
vim test.sh

#!/bin/bash

if [ $1 -eq 1 ]
then
	echo "星期一"
else if [ $1 -eq 2 ]
then
	echo "星期二"
else if [ $1 -eq 3 ]
then
	echo "星期三"
	else if [ $1 -eq 4 ]
then
	echo "星期四"
	else if [ $1 -eq 5 ]
then
	echo "星期五"
	else if [ $1 -eq 6 ]
then
	echo "星期六"
	else if [ $1 -eq 7 ]
then
	echo "星期日"
else
	echo "输入不合法"
fi

sh test.sh 2
星期二

case语句实现星期几的打印

# case语句实现星期几的打印
vim test.sh

#!/bin/bash

case $1 in
"1")
	echo "星期一"
	;;
"2")
	echo "星期二"
	;;
"3")
	echo "星期三"
	;;
"4")
	echo "星期四"
	;;
"5")
	echo "星期五"
	;;
"6")
	echo "星期六"
	;;
"7")
	echo "星期日"
	;;
*)
echo "输入不合法"
esac

sh test.sh 5
星期五

$@和$*的区别

#  $@和$*的区别
vim test.sh

#!/bin/bash

for i in "$@"	# 区分每个参数
do
	echo $i
done

for i in "$*"	# 作为一个参数整体
do
	echo $i
done

sh test.sh 1 2 3 4 5
1
2
3
4
5
1 2 3 4 5

求和

# 求和
vim test.sh

#!/bin/bash

sum=0

for i in "$@"
do
	sum=$[$sum+$1]
done

echo "sum=$sum"

sh test.sh 1 2 3 4 5 6
sum=21

求从1加到n的和

# 求从1加到n的和 for
vim test.sh

#!/bin/bash

sum=0

for (( i=1; i<=$1; i++ ))
do
	sum=$[$sum+$i]
done

echo "从1加到$1的和为$sum"

sh test.sh 100
从1加到100的和为5050
# 求从1加到n的和 while
vim test.sh

#!/bin/bash

sum=0

i=0
while [ $i -le $1 ]
do
	sum=$[$sum+$i]
	let i++
done

echo "从1加到$1的和为$sum"

sh test.sh 10
从1加到10的和为55

打印1到10中的偶数(用continue)

# 打印1到10中的偶数(用continue)
vim test.sh

#!/bin/bash

for (( i=0; i<=10; i++ ))
do
	if [ $[$i%2] -eq 1 ]
	then
		continue
	fi

	echo $i
done

sh test.sh
2
4
6
8
10

read语句获取输入练习

#  read语句获取输入练习
vim test.sh

#!/bin/bash

read -p "请输入:" m
echo $m

read -t 6 -p "请输入:" n	# 获取输入,只等待6s
echo $n

sh test.sh
请输入:1
1
请输入:2
2

sh test.sh
请输入:1
1
请输入:	# 6s内未输入

判断一个数是否为素数

# 判断一个数是否为素数
vim prime.sh

#!/bin/bash

read -p "请输入一个数,将返回其是否为素数:" n

for (( i=2; i<n; i++ ))
do
	if [ $[$n%$i] -eq 0 ]
	then
		break
	fi
done

if [ $i -eq $n ]
then
	echo "$n是素数"
else
	echo "$n不是素数"
fi

sh prime.sh
请输入一个数,将返回其是否为素数:6
6不是素数
sh prime.sh
请输入一个数,将返回其是否为素数:7
7是素数

打印1到100间的素数

# 打印1到100间的素数
vim prime.sh

#!/bin/bash

for (( n=2; n<=100; n++ ))
do
	for (( i=2; i<n; i++ ))
    do
        if [ $[$n%i$] -eq 0 ]
        then
            break
        fi
    done

    if [ $i -eq $n ]
    then
        echo "$n
    fi
done

# 运行结果略

统计某一路径下文件的个数

# 统计某一路径下文件的个数
vim cnt_of_files.sh

#!/bin/bash

dir=/var/log	# 这里以/var/log下的文件个数为例
cnt=0

for i in $dir/*
do
	if [ -f $i ]
	then
		let cnt++
	fi
done

echo "$dir下共有$cnt个文件"

sh cnt_of_files.sh
/var/log下共有28个文件

利用数组打印首项为1公比为2的等比数列前10项

# 利用数组打印首项为1公比为2的等比数列前10项
vim demo.sh

#!/bin/bash

arr[0]=1

for (( i=1; i<10; i++ ))
do
	arr[$i]=$[${arr[$i-1]}*2]
done

# 遍历打印数组元素
i=0
until [ -z ${arr[$i]} ]
do
	echo ${arr[$i]}
	let i++
done
# 运行结果略

求一个无序数组内的最大元素

# 求一个无序数组内的最大元素
vim max.sh

#!/bin/bash

arr=(10 2 5 -9 6 15 3 7 8)
max=${arr[0]}

i=0
until [ -z ${arr[$i]} ]
do
	if [ $max -lt ${arr[$i]} ]
	then
		max=${arr[$i]}
	fi
	
	let i++
done

echo "最大值是$max"

sh max.sh
最大值是15

自定义对两个数求和

# 自定义对两个数求和
vim test.sh

#!/bin/bash

add() {
	if [ $# -ne 2 ]	# 检查参数长度是否为2
	then
		echo "参数需要2个,现在你传入的参数不是2个!"
		return		# 直接退出函数
	fi
	
	echo "$1+$2=$[$1+$2]"
}

add 2 4

sh test.sh
2+4=6

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值