2021-06-28

Linux 常用指令

简单指令

who
who i am
echo ‘hello world’
date 
cal 2021
cal 7 2021
clear
passwd

文件操作命令

文件显示
 	cat a.java
匹配命令
	grep heng /etc/passwd #在/etc/passwd中查找包含heng的所有行
	find . -name “*.py” #在当前目录下查找所有以.py结尾的文件
find

复制、删除和移动文件的命令
	cp a.java /home/heng/javaFiles
	cp -r /home/heng/javaFiles /home/heng

	rm -r * #删除当前目录下除隐含文件以外的所有文件
 	rm -d /home/heng/empty #删除空文件夹

	mv a.java b.java #rename
	mv b.java ..

创建目录、显示目录内容

mkdir heng #创建名为heng的文件夹
ls #显示当前文件夹目录下的所有文件
ls heng #显示heng文件夹下的所有文件
ls -a heng #显示heng目录下的所有文件,包括隐藏文件夹

chmod命令

ugoa:
u 用户—文件/目录拥有者。user
g 同组用户,与拥有者属于同一个用户组下的用户 group
o 其他用户 others
a 所有用户 all —系统默认值
+添加
-取消
=将文件权限改变为等号后的状态
r 可读
w 可写
x 可执行

chmod key filename #一会分开讲

chmod a+x a.sh. #让a.sh所有人都可以执行
chmod u+rwx,g+rx,a+r a.sh#所用用户都可读该文件,同一组下的用户还可以执行该文件 该用户可读写执行该文件
chmod a-x b.sh #所有用户均不可执行b.sh
chmod a=rw,g=rw,u=rwx a.sh#自己分析

进程

	ps #显示所有进程状态
	ps -e #
	ps -a #这两个都是显示所有进程的信息
	ps -f #显示进程的所有信息
	ps -ef #显示所有进程的全部信息
	ps aux #显示所有终端上所有用户的有关进程的所有信息

Linux shell程序设计

简单的shell示例

#!/bin/bash
#If no arguments , then listing the current directory 
#Otherwise ,listing each subdirectory
if test $# = 0
	then ls .
else
	for i
	do
		ls -l $i | grep ‘^d’
	done
fi

案例当中
$# 表示命令行参数个数
若无传人参数,就ls .输出当前文件夹下文件
否则就会执行以下操作
补充两点

  1. 如何传参
    bash a.sh 第一个参数 第二个参数 第三个参数 ... 第n个参数
  2. 参数如何获取
    $1 $2 ... $9 ${10}

for 变量 是与for 变量 in $* 等价的

也就是说
对于传入的每一个参数,都输出该路径下的所有子目录
ls -l $i的结果首位为d的行,指代的一定是一个目录 (可以自己动手试试)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XxLdWtK3-1624858823956)(Linux%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4/%E7%85%A7%E7%89%87%202021%E5%B9%B46%E6%9C%8826%E6%97%A5%20%E4%B8%8B%E5%8D%8811834.jpg)]

变量引用

${name[*]}${name[@]}

for i in "${person[*]}"
do 
	echo $i
done
for i in "${person[@]}"
do 
	echo $i
done

结果就是
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P2JcPGaN-1624858823958)(Linux%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4/%E7%85%A7%E7%89%87%202021%E5%B9%B46%E6%9C%8826%E6%97%A5%20%E4%B8%8B%E5%8D%8812144.jpg)]

注意双引号不能省
${name[*]}拓展成一个字符串 ${name[@]}拓展成多个词

${name#pattern}${name##pattern}
两者均为用正则表达式匹配变量字符串中的开头
前者为贪婪模式,后者为懒惰模式

${name%pattern}${name%%pattern}
两者均为用正则表达式匹配变量字符串中的匹配
前者为贪婪模式,后者为懒惰模式

环境变量

  1. $HOME
    用户主目录的全名
    $HOME == _home_heng
  2. $LOGNAME
    $LOGNAME == heng
  3. $MAIL
    $MAIL == _var_spool_mail_heng
  4. $PATH
    PATH中的字符串顺序决定了从哪个目录查找
  5. $PS1
    shell主提示符
  6. $PWD
    当前工作目录的路径
  7. $SHELL
    指出当前shell指示程序存放在哪
  8. $TERM
    终端类型

for语句

打印n行*,第k行打印k个,n由用户在命令行决定

for ((i=1;i<=$1;i++))
do
	for((j=1;j<=i;j++))
	do
		echo -n "*"
	done
	echo ""
done
	echo "end"

break 语句

反向输出传入的参数

count=$#
cmd=echo
while true
do
        cmd="$cmd \$$count" #巧妙的递归方式
        ((count=count - 1)) #赋值语句
        if [ $count -eq 0 ]
        then break
        fi
done
eval $cmd

eval —能够将后面的参数用值替换 后将替换过的语句放在命令行中调用

select break二合一示例

输入选项,执行相应语句

PS3="Choice?"
select choice in query add delete update list exit
do
	case "$choice" in
		query) 
			echo "call query routine"
			break;;
		add) 
			echo "call add routine"
			break;;
		update)
			echo "call update routine"
			break;;
		list)
			echo "call list routine"
			break;;
		exit)
			echo "call exit routine"
			break;;
			
	esac

	echo "your choice is $choice"
done

注:case中,每一个分支以模式)开头;;结尾

习题四

4.8
  1. 分析下列shell脚本功能
count=$#
come=echo
while [ $count -gt 0 ]
do
	cmd=$cmd  \$$count”
	count=`expr $count - 1`
eval $cmd 

在应在答案:反向输出传入的参数

  1. 利用for循环将当前目录下的.c文件移到指定目录下,并按照文件大小排序,显示移动后指定目录的内容
#!/bin/bash
  
echo 'input a directory'
read dir

if [ -d $dir ]
then
        for name in `ls . | grep -E '.*(.c)$'`
        do
                mv $name $dir
        done
        ls -S $dir
else
        echo 'what just input is not a directory'
fi
  1. 编写一个shell脚本,求前十项斐波那契数列及其总和
#!/bin/bash
  
let a=1
let b=1
echo -n -e "$a\t$b"
let n=a+b
let count=4
while [ $count -gt 0 ]
do
        let a=a+b
        let b=b+a
        echo -n -e "\t$a\t$b"
        let n+=a+b
        let count=count-1
done
echo
echo "the sum is $n"
  1. 设计一个程序cuts,由标准输入读取数据,获取由第一个参数n和第二个参数m所限定范围内的数据,n和m都是整数,即从输入的字符串中抽取第n个字符至第m个字符之间所有字符(包括这两个字符)
#!/bin/bash
echo "input a string:"
read str
echo $str | cut -c $1-$2
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个可能的Java实现: ```java import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; public class RentPlanGenerator { private static final double RENT_INCREASE_RATE = 0.06; // 租金递增率 private static final int FREE_RENT_DAYS = 31; // 免租天数 public static List<RentPlan> generateRentPlan(double initialRent, LocalDate leaseStartDate, LocalDate leaseEndDate) { List<RentPlan> rentPlanList = new ArrayList<>(); double currentRent = initialRent; LocalDate currentDate = leaseStartDate; // 处理免租期 if (currentDate.isBefore(leaseStartDate.plusDays(FREE_RENT_DAYS))) { currentDate = leaseStartDate.plusDays(FREE_RENT_DAYS); } while (currentDate.isBefore(leaseEndDate)) { LocalDate nextIncreaseDate = currentDate.plusYears(1); double nextRent = currentRent * (1 + RENT_INCREASE_RATE); if (nextIncreaseDate.isBefore(leaseStartDate.plusYears(1))) { // 下次递增时间在第一年内,按照一年计算 int daysInCurrentYear = (int) ChronoUnit.DAYS.between(currentDate, nextIncreaseDate); rentPlanList.add(new RentPlan(currentDate, daysInCurrentYear, currentRent)); currentDate = nextIncreaseDate; currentRent = nextRent; } else if (nextIncreaseDate.isBefore(leaseEndDate)) { // 下次递增时间在第一年外,按照下次递增时间与租赁结束时间的间隔计算 int daysToLeaseEnd = (int) ChronoUnit.DAYS.between(currentDate, leaseEndDate); rentPlanList.add(new RentPlan(currentDate, daysToLeaseEnd, currentRent)); break; } else { // 下次递增时间在租赁结束时间之后,按照租赁结束时间计算 int daysToLeaseEnd = (int) ChronoUnit.DAYS.between(currentDate, leaseEndDate); rentPlanList.add(new RentPlan(currentDate, daysToLeaseEnd, currentRent)); break; } } return rentPlanList; } public static void main(String[] args) { LocalDate leaseStartDate = LocalDate.of(2021, 3, 1); LocalDate leaseEndDate = LocalDate.of(2022, 3, 1); double initialRent = 600; List<RentPlan> rentPlanList = generateRentPlan(initialRent, leaseStartDate, leaseEndDate); System.out.printf("%-12s%-12s%-12s%n", "时间", "天数", "租金"); for (RentPlan rentPlan : rentPlanList) { System.out.printf("%-12s%-12d%-12.2f%n", rentPlan.getStartDate(), rentPlan.getDays(), rentPlan.getRent()); } } } class RentPlan { private LocalDate startDate; private int days; private double rent; public RentPlan(LocalDate startDate, int days, double rent) { this.startDate = startDate; this.days = days; this.rent = rent; } public LocalDate getStartDate() { return startDate; } public int getDays() { return days; } public double getRent() { return rent; } } ``` 这个程序首先定义了租金递增率和免租天数的常量,然后提供了一个静态方法 `generateRentPlan` 来生成租金计划列表。该方法接受三个参数:初始月租金、租赁开始时间和租赁结束时间。 具体实现时,我们使用循环来逐月生成租金计划。在每次循环中,我们首先计算下次递增租金的时间和金额。然后根据下次递增时间与租赁开始时间的间隔,决定本次循环处理的天数和租金金额。最后将这些信息保存到一个 `RentPlan` 对象中,并添加到租金计划列表中。 在主函数中,我们使用 `generateRentPlan` 方法生成租金计划列表,并以表格形式输出。输出结果如下: ``` 时间 天数 租金 2021-04-01 30 600.00 2021-05-01 31 636.00 2021-06-01 30 674.16 2021-07-01 31 713.57 2021-08-01 31 754.29 2021-09-01 30 796.39 2021-10-01 31 840.94 2021-11-01 30 887.02 2021-12-01 31 934.72 2022-01-01 31 984.12 2022-02-01 28 1035.30 ``` 可以看到,程序正确地根据递增周期和递增率生成了每个月的租金计划,并且考虑了免租期的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值