Linux系统 Shell脚本语言

Shell脚本编程

Shell 是系统的用户界面,提供用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行,实际上 Shell 是一个命令解释器,解释由用户输入的命令,并且把它们送到内核。

Bash(GNU Bourne-Again Shell)是一个为 GNU 计划编写的 Unix shell ,它是许多 Linux 平台默认使用的 shell。

shell 是一个命令解释器,是介于操作系统内核与用户之间的一个绝缘层。
准确的说,它也是能力很强的计算机语言,被称为解释性语言或脚本语言。

它可以准确将系统调用、公共程序、工具和编译过的二进制程序“粘合”在一起来建立应用,这是大多数脚本语言的特征,所以脚本语言又叫做“胶水语言”

vim hello.sh

Linux系统 Shell脚本语言_第1张图片

1、运行 Bash脚本 的方式:

sh hello.sh
bash hello.sh
. ./hello.sh(前面的.相当于执行,后面的./相当于加载)
source hello.sh

Linux系统 Shell脚本语言_第2张图片
可以加权限:

chmod u+rx hello.sh

Linux系统 Shell脚本语言_第3张图片

2、使用 重定向:

echo "hello world" > my.txt
cat my.txt

Linux系统 Shell脚本语言_第4张图片

3、用shell脚本清空一个文本内容,但是保留这个文件

首先去目录找到这个文件

cd /var/log

打开这个文件看看都有啥

cat wtmp

Linux系统 Shell脚本语言_第5张图片

创建一个shell脚本:cleanlogs.sh,用它去清除!

vim cleanlogs.sh

Linux系统 Shell脚本语言_第6张图片

LOG_DIR=/var/log

cd $LOG_DIR

cat /dev/null > wtmp

echo "Logs cleaned up."

exit

将shell脚本运行起来:

sh cleanlogs.sh

就清理干净了:
Linux系统 Shell脚本语言_第7张图片
再看,文件还在,但是文件里的内容清理干净了
Linux系统 Shell脚本语言_第8张图片

4、Bash特殊字符

(1)注释(#)

echo "The # asdfghjkl"
echo "The \# asdfghjkl"
echo The # asdfghjkl
echo The \# asdfghjkl

Linux系统 Shell脚本语言_第9张图片
注意引号与注释的问题,看结果:

Linux系统 Shell脚本语言_第10张图片

(2)分号(;)

命令分隔符,可以在同一行输入两个命令(echo … ; echo …),用分号分隔开就好

还可以作为 case选项 的终止符号(;;)

Linux系统 Shell脚本语言_第11张图片

(3)点号(.)

Linux系统 Shell脚本语言_第12张图片

(4)引号

Linux系统 Shell脚本语言_第13张图片

(5)斜线 与 反斜线

Linux系统 Shell脚本语言_第14张图片

(6)反引号

Linux系统 Shell脚本语言_第15张图片
先执行 创建文件夹back,后执行 txt文件 移动

(7)冒号(:)

Linux系统 Shell脚本语言_第16张图片

(8)问号(?)

Linux系统 Shell脚本语言_第17张图片
三目运算符,是 如果 a小于50成立,t 就取值为 8 ;如果 a 小于50不成立,t 就取值为 9

(9)美元符号($)

Linux系统 Shell脚本语言_第18张图片

(10)小括号( () )

Linux系统 Shell脚本语言_第19张图片

(10)小括号( () )

Linux系统 Shell脚本语言_第20张图片

(11)大括号( {} )

Linux系统 Shell脚本语言_第21张图片
Linux系统 Shell脚本语言_第22张图片

(12)中括号( [ ] )

Linux系统 Shell脚本语言_第23张图片

变量的使用

(1)调用变量时加 美元符号$

myname="Baidu"

echo $myname
echo ${myname}
echo ${myname}Good
echo $mynameGood

myname="Google"
echo ${myname}

Linux系统 Shell脚本语言_第24张图片
Linux系统 Shell脚本语言_第25张图片

(2)只读变量

myurl="http://www.baidu.com"
readonly myurl
myurl="http://www.bing.cn"

Linux系统 Shell脚本语言_第26张图片
Linux系统 Shell脚本语言_第27张图片

写一个 “百钱百鸡” 的问题

for ((m=0;m<20;m++));do
   for ((n=0;n<33;n++));do
      k=0
      while [ $k -lt 100 ];do
           sum=`expr $m + $n + $k`
           money0=`expr $m \* 5`
           money1=`expr $n \* 3`
           money2=`expr $k / 3`
           money=`expr $money0 + $money1 + $money2`
           if [[ $sum -eq 100 && $money -eq 100 ]]; then
               echo $m
               echo $n
               echo $k
           fi
            k=`expr $k + 3`
         done
      done
  done

Linux系统 Shell脚本语言_第28张图片
Linux系统 Shell脚本语言_第29张图片


练习:

敬上参考链接:https://blog.csdn.net/weixin_43168314/article/details/88954059

1-100累加

sum=0
for i in `seq 100`;do
sum=$(($sum + $i))
done
echo $sum
sum=0
for i in `seq 100`;do
sum=`expr $sum + $i`
done
echo $sum
#!/bin/bash
# 输入一个数并进行是否为正整数判断,为正整数则输出1到这个数的累加结果·

while :
do 
read -p "请输入一个正整数 :" n
if echo $n | grep -q '[^0-9]'
then
  echo "你没有输入一个正整数!"
  continue
fi
if [ ! -n "$n"  ]
then
  echo "你没有输入一个正整数!"
  continue
fi
if [ $n -lt 1 ]
then 
  echo "你没有输入大于1的数! "
  continue
fi
for i in `seq $n`
do 
  j=$(($j+$i))
done
echo $j
exit
done 

打印 九九乘法表:

for i in `seq 9`;do
     for j in `seq $i`;do
        echo -ne ${j} '\*'${i}'='$(($i*$j))
     done
     echo ''
done

Linux系统 Shell脚本语言_第30张图片
练一下分支:

1、做学生成绩系统,如果成绩大于80分,输出优秀,如果成绩大于70分并且小于80分,输出良好,如果成绩大于60分并且小于70分,输出及格,小于60分输出不及格。

read -p '请输入成绩:' score
if [ $score -lt 60 ];then
echo '不及格'
elif [[ $score -ge 60 && $score -lt 70 ]];then
echo '及格'
elif [[ $score -ge 70 && $score -lt 80 ]];then
echo '良好'
else
echo '优秀'
fi

Linux系统 Shell脚本语言_第31张图片

2、输入一个数,判断它是否能被 3、5、7 整除,注意考虑同时整除的情况

read -p  '请输入一个数:' a
b=`expr $a % 3`
c=`expr $a % 5`
d=`expr $a % 7`
if [[ $b -eq 0 || $c -eq 0 || $d -eq 0 ]];then
echo '可以'
else
echo '不可以'
fi

Linux系统 Shell脚本语言_第32张图片

3、打印某年某月有多少天。(提示:A、闰年的计算方法:年数能被4整除,并且不能被100整除;或者能被400整除的整数年份。
B、利用%运算可以判断一个数能否被另一个数整除。C、用CASE语句)

read -p  '请输入一个年份:' year
read -p  '请输入一个月份:' month
a=`expr $year % 4`
b=`expr $year % 100`
c=`expr $year % 400`
if [[ month -eq 1 || month -eq 3 || month -eq 5 || month -eq 7 || month -eq 8 || month -eq 10 || month -eq 12 ]];then
echo '31天'
elif [[ month -eq 4 || month -eq 6 || month -eq 9 || month -eq 11 ]];then
echo '30天'
elif [[ month -eq 2 && a -eq 0 && b -ne 0 || c -eq 0 ]];then
echo '29天'
else
echo '28天'
fi

Linux系统 Shell脚本语言_第33张图片
Linux系统 Shell脚本语言_第34张图片

4、做学院评奖系统:

  • 1)如果数学成绩大于80分并且语文成绩大于80分,获奖学金500元。
  • 2)如果数学小于30并且语文小于30分,输出重修。
read -p '请输入数学成绩:' math
read -p '请输入语文成绩:' chinese
if [[ $math -ge 80 && $chinese -ge 80 ]];then
  echo '奖学金500'
elif [[ $math -lt 30 && $chinese -lt 30 ]];then
  echo '重修'
fi

Linux系统 Shell脚本语言_第35张图片

5、输入三个数,如果其中有一个值大于1000,则提示,输入的数值有大于1000的。

read -p '请输入第一个数:' a
read -p '请输入第二个数:' b
read -p '请输入第三个数:' c
if [[ $a -gt 1000 || $b -gt 1000 || $c -gt 1000 ]];then
echo '三个数中有大于1000的数'
else
echo '没有大于1000的'
fi

Linux系统 Shell脚本语言_第36张图片

6、定义一个字符,判断是否为字母。

7、定义一个整数,计算其平方值和立方值。

8、定义一个大 写字母,把它转换为小写字母后显示出来。

# 有两个选项 -l 代表小写,-u 代表大写
typeset -u name
name='asdfgh'
echo $name

typeset -l nam
nam='asdfgh'
echo $nam

在这里插入图片描述

9、一位学生参加了三门不同科目的考试,计算并显示所得的总分和平均分同时显示单科所得分数。

10、定义三个数a=10,b=20,c=30 a+=10;b-=4; c%=2; 输出a b c 的结果

11、定义三个数,求出其中的最大值

read -p '请输入第一个数:' a
read -p '请输入第二个数:' b
read -p '请输入第三个数:' c
if [[ $a -gt $b && $a -gt $c ]];then
max=$a
echo $max
elif [[ $b -gt $a && $b -gt $c ]];then
max=$b
echo $max
else
max=$c
echo $max
fi

Linux系统 Shell脚本语言_第37张图片

12 、如果 score 值大于90,则奖励一个 Iphone 6s ,当 score 值小于等于 90 时,先判断 score 是否大于 70 ,如果 score 是介于 70–90 之间,则奖励一个红米,如果成绩小于等于 70 ,则罚做 50 个俯卧撑

read -p '请输入成绩:' score
if [[ $score -ge 90 ]];then
echo '奖励iphone 6s'
elif [[ $score -ge 70 && $score -lt 90 ]];then
echo '奖励一个红米'
else
echo '做俯卧撑'
fi

Linux系统 Shell脚本语言_第38张图片

Linux系统 Shell脚本语言_第39张图片

13、对一批货物征收税金(长整型)。价格在1万元及以上的货物征税5%,在5000元及以上,1万元以下的货物征税3%,在1000元及以上,5000元以下的货物征税2%,
1000元以下的货物免税。编写一程序,读入货物价格,计算并输出税金。

14、输入3个整数,将其中最小的数输出。

15、某超市为了促销,规定:购物不足50元的按原价付款,超过50不足100的按九折付款,超过100元的,超过部分按八折付款。编一程序完成超市的自动计费的工作。

16、当前小学生的成绩单由以前的百分制改为优秀、良好、合格、不合格四个等级的等级制。编一程序完成分数的自动转换工作。
转换规则如下:60分以下的为不合格;60到69分为合格;70到89分为良好;90分以上的为优秀。(提示:可以利用除法运算来使程序更简明,结合case语句)。


关于函数:

function funWithRet(){
  echo 'This function will add the two number of the input...'
  echo 'Enter the first number:'
  read aNum
  echo 'Enter the second number:'
  read anotherNum
  echo The two numbers are $aNum and $anotherNum
  return $(($aNum+$anotherNum))
}

funWithRet
echo The sum of two numbers entered is $?!

Linux系统 Shell脚本语言_第40张图片
Linux系统 Shell脚本语言_第41张图片


循环的题目练习:

1、本金10000元存入银行,年利率是千分之三,每过1年,将本金和利息相加作为新的本金。计算5年后,获得的本金是多少?

cost1=10000
n=1
while(($n<=5));do  
if [[ ${n} -le 5 ]];then
    tax=`expr $cost1 / 1000 \* 3`
    cost1=`expr $cost1 + $tax`
fi
n=$(($n+1))
#echo $cost1
done
echo $cost1

在这里插入图片描述

money=10000
for i in `seq 5`;do
  m=$(echo "scale=2;$money * 0.003"|bc)
  money=$(echo "$money+$m"|bc)
done
echo $money

Linux系统 Shell脚本语言_第42张图片

2、计算出1—100之间所有能被3整除的整数的和?

3、找出一个数的所有因子数

4、输入一个数,判断这个数是否是素数;

5、定义一个正整数如:1205 统计它的各位数字中零的个数,并求各位数字中的最大者。

6、有1020个西瓜,第一天卖掉总数的一半后又多卖出两个,以后每天卖剩下的一半多两个,问几天以后能卖完

7、猴子吃桃问题: 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃了一半,又多吃一个,以后每天都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子。求第一天共摘了多少个?

8、判断一个数是否是完全数(完数指的是一个数的所有因子数的和等于这个数本身,例如 6=1+2+3,即6就是完全数)

9、循环录入某学生5门课的成绩并计算平均分,如果某分数录入为负,停止录入并提示录入错误(使用break N)

10、循环录入python课的学生成绩,统计分数大于等于 80分的学生比例(使用continue N)

11、有个人想知道,一年之内一对兔子能繁殖多少对?于是就筑了一道围墙把一对兔子关在里面。已知一对兔子每个月可以生一对小兔子,而一对兔子从出生后第3个月起每月生一对小兔子。假如一年内没有发生死亡现象,那么,一对兔子一年内(12个月)能繁殖成多少对? 分析:兔子的规律为数列,1,1,2,3,5,8,13,21

12、打印空心菱形

你可能感兴趣的:(Linux)