Linux Shell编程

Shell概述

shell是用户和系统内核之间的接口程序
shell是命令解释器
shell指linux的终端,即解释用户命令和shell程序的文字终端

查看用户使用shell的设定:
通过查看/etc/passwd文件可以查看用户使用的shell类型:cat /etc/passwd
查看安装的shell:cat /etc/shells

Shell程序的特点及用途

shell程序可以认为是将shell命令按照控制结构组织到一个文本文件中,批量的交给shell去执行
不同的shell解释器使用不同的shell命令语法
shell程序解释执行,不生成可以执行的二进制文件
可以帮助用户完成特定的任务,提高使用、维护系统的效率
了解shell程序可以更好的配置和使用linux
Shell使用解释型语言,不需重新编译
它适合于编写执行相对简单的任务的工具,因为它更强调易于配置、维护和可移植性
它不适合用来完成时间紧迫型和处理器忙碌型的任务

shell程序结构

在这里插入图片描述
执行程序:
可以使用 /bin/bash filename
添加执行权限,指定路径执行:chmod +x /path/filename
运行:./path/filename

shell程序一般结构:
shell类型
函数
主过程
在这里插入图片描述
变量声明及赋值格式:变量=值 (注意:等号两侧不能有空格)
变量的引用:$变量名 或者 ${变量名}
如果字符串里包含空格,就必须用引号把它们括起来。默认情况下,所有输入的内容都是字符串。

示例:
在这里插入图片描述
在这里插入图片描述


程序编译和运行过程

在这里插入图片描述

位置变量

bash在解释用户命令时,会把所输入的命令后面的参数使用位置变量传递给bash脚本程序
$1、$2… $n分别代表参数1、参数2…参数n
$0 则代表脚本的名字
$*:这个变量包括参数的列表(字符串)。
$@:这个变量包括参数的列表(数组)。
$#:这个变量包括参数的个数。
在这里插入图片描述
在这里插入图片描述

环境变量

在这里插入图片描述
提示符特殊字符代码
\ ! 显示该命令的历史记录编号。
\ # 显示当前命令的命令编号。
\ $ 显示$符作为提示符,如果用户是root的话,则显示#号。
\ \ 显示反斜杠。
\d 显示当前日期。
\h 显示主机名。
\s 显示当前运行的shell的名字。
\t 显示当前时间。
\u 显示当前用户的用户名。
\W 显示当前工作目录的名字。
\w 显示当前工作目录的路径。

在shell的环境变量中更改.bashrc
/etc/profile
/etc/environment
source .bashrc 马上生效

简单数学表达式
① expr命令计算一个表达式的值
格式 :expr arg
例子:计算(2+3)×4的值
1、分步计算,即先计算2+3,再对其和乘4

s=`expr 2 + 3`
expr $s \* 4

2、一步完成计算:

expr  `expr 2 + 3 `  \* 4 

说明:
运算符号和参数之间要有空格分开;
通配符号(*),在作为乘法运算符时要用\、“”、‘’符号修饰

② let命令
格式:let arg1 [arg2 …]
例子:计算(2+3)×4的值

let s=(2+3)*4

说明:
与expr命令相比,let命令更简洁直观。
运算符号和参数之间不能有空格。
当运算符中有<、>、&、|等符号时,同样需要用引号(单引号、双引号)或者斜杠来修饰运算符。

条件判断

1、常见的条件:
变量属性;
文件属性;
命令执行结果;
多种条件的逻辑组合;
2、判断结果的一般定义:
真:0
假:1
3、格式:
test condition
[ condition ] #[右边和]左边需要有空格
在这里插入图片描述
在这里插入图片描述

整数关系
在这里插入图片描述
逻辑运算
逻辑与-a:condition1 -a condition2,如果两个条件都为真,则结果为真。
逻辑或-o:condition1 -o condition2,如果两个条件有一个为真,则结果为真。
逻辑非!:! condition,结果与condition相反。


控制结构

控制结构: 根据某个条件的判断结果,改变程序执行的路径。可以简单的将控制结构分为分支和循环两种 。
常见分支结构: if 、case
常见循环结构: for 、while、until

If分支
在这里插入图片描述
说明:
小括号中的部分可省略;
当条件为真(0)时执行then后面的语句,否则执行else后面的语句;
以fi作为if结构的结束。


case分支
在这里插入图片描述
说明:
“条件”可以是变量、表达式、shell命令等;
“模式”为条件的值,并且一个“模式”可以匹配多种值,不同值之间用竖线(|)联结 ;
一个模式要用双分号(;;)作为结束 ;
以逆序的case命令(esac)表示case分支语句的结束

模式的匹配可以使用通配符
?:仅匹配一个字符
*:匹配任意字符
[…]:配置方括号中的任意一个字符
[!..] : 不匹配方括号中的任意字符
[a-zA-Z] : -指定一个取值范围


for循环
在这里插入图片描述
说明:
“列表”为存储了一系列值的列表,随着循环的进行,变量从列表中的第一个值依次取到最后一个值;
do和done之间的命令通常为根据变量进行处理的一系列命令,这些命令每次循环都执行一次;
如果中括号中的部分省略掉,Bash则认为是“in $@”,即执行该程序时通过命令行传给程序的所有参数的列表。


while/until循环
在这里插入图片描述
说明:
while循环中,只要条件为真,就执行do和done之间的循环命令;
until循环中,只要条件不为真,就执行do和done之间的循环命令,或者说,在until循环中,一直执行do和done之间的循环命令,直到条件为真;
避免生成死循环
break continue shift


函数
定义
在这里插入图片描述
引用
function_name [参数1,参数2…参数n]

说明:
中括号中的部分可以省略;
如果在函数内部需要使用传递给函数的参数,一般用$ 0、$ 1、…、$ n,以及$ #、$ *、$ @这些特殊变量 :
$0为执行脚本的文件名;
$1是传递给函数的第1个参数 ;
$#为传递给函数的参数个数;
$ *和$ @为传递给函数的所有参数

grep

$ ls -l | grep ‘^a’
通过管道过滤ls -l输出的内容,只显示以a开头的行。
$ grep ’test’ *.txt
显示所有以txt结尾的文件中包含test的行。
$ grep ‘test’ aa bb cc
显示在aa,bb,cc文件中匹配test的行。
$ grep ‘[a-z]\ {5,\ }’ aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行

grep正则表达式元字符集(基本集)
在这里插入图片描述

编程案例

  1. 设计如下⼀个菜单驱动程序,保存为: menu.sh
    菜单程序将根据⽤户输⼊的选择项给出相应信息,直到输⼊Q|q才退出程序(循环),否则⼀
    直提示操作信息
    Use one of the following options:
    P:To display current directory
    S:To display the name of running file
    D:To display today’s date and present time(如:2017-04-26 05:45:12)
    L:To see the list of files in your present working directory
    W:To see who is logged in
    I:To see the ip address of this local machine
    Q:To quit this program
    Enter your option and hit:
    要求对⽤户的输⼊忽略⼤⼩写,对于⽆效选项的输⼊给出相应提示。
    要求使⽤case语句实现以上功能,输⼊相应的字⺟后应该执⾏相应的命令完成每项功能,如
    输⼊P或p,就执⾏pwd命令。
#!/bin/bash
echo -n "
P:To display current directory
S:To display the name of running file
D:To display today's date and present time(如:2017-04-26 05:45:12)
L:To see the list of files in your present working directory
W:To see who is logged in
I:To see the ip address of this local machine
Q:To quit this program
"
while true
do
echo -n "Enter your option and hit:"
read option
case "$option" in
[pP])
		pwd
;;
[sS])   
        echo $0
;;
[dD])   
        date "+%Y-%m-%d %H:%M:%S"
;;
[lL])   
        ls
;;
[wW])
        whoami
;;
[iI])
        ip addr
;;
[qQ])
        exit 0
;;
*)
echo "you can only input 'p s d l w i q!'"
;;
esac
done
exit 1;

  1. 编写⼀段bash shell程序,保存为:score.sh
    根据键盘输⼊的学⽣成绩,显示相应的成绩登等级,
    其中
    60分以下为"Failed!",
    60~69分为"Passed!",
    70~79分为"Medium!",
    80~89分为"Good!",
    90~100为"Excellent!"。
    如果输⼊超过100的分数,则显示错误分数提示。
    如果输⼊负数,则退出程序,否则⼀直提示⽤户输⼊成绩
#!/bin/bash
while true
do
echo -n "please input a student score:"
read score
if [ "$score" -gt 100 ];
then 
	echo "input error!"
elif [ "$score" -ge 90 ];
then
	echo "Excellent!"
elif [ "$score" -ge 80 ];
then
	echo "Good!"
elif [ "$score" -ge 70 ];
then
	echo "Medium!"
elif [ "$score" -ge 60 ];
then
	echo "Passed!"
elif [ "$score" -ge 0 ];
then
	echo "Failed!"
else
	exit 0
fi
done	
  1. 编写⼀段bash shell程序,保存为file.sh
    判断⽤户输⼊是否为有效⽬录路径。如果不是,提示该路径不是⽬录路径。如果是
    ,则依次输出该⽬录下的所有内容的 “⽂件路径_⽂件类型符号”形式。
    直到⽤户输⼊q退出,否则⼀直提示⽤户输⼊。
#!/bin/bash
while true
do
	echo -n "please input a path:"
	read path
	if [ -d $path ];
	then
                for fileName in ${path}/*
                do
                if [ -d $fileName ];
                then
                        fileType="d"
                else
                        fileType=`ls -l $fileName|cut -c1`
                fi
                echo "${fileName}_${fileType}"
                done
	elif [ $path = "q" ];
	then
		exit 0
	else
		echo "invalid directory path!"
	fi
done

  1. 编写⼀段bash shell程序,保存为 program.sh
    完成以下输出,可循环执⾏:
    please,input a number:
    5(回⻋)
    5 4 3 2 1
    4 3 2 1
    3 2 1
    2 1
    1
#!/bin/bash
echo "please,input a number:"
read n
for((i=0;i<$n;i++));
do
	for((j=n-i;j>0;j--));
	do 
	echo -n "$j "
	done
echo
done

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值