【GL004】Linux

shell编程

Shell 是一个命令解释权,它为用户提供了一个向 Linux 内核发送请求以便运行程序界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。

shell 编程的基本过程分为三步:

复制代码
step1. 建立 shell 文件
       包含任意多行操作系统命令或shell命令的文本文件;
step2. 赋予shell文件执行权限
       用chmod命令修改权限;
step3. 执行shell文件
       直接在命令行上调用shell程序.

示例:

复制代码
step1: 建立shell文件 (可用任何建立文本文件的方法)
	$ cat  prog1.sh
		date
Step2: 赋予执行权限:  (初始文本文件无执行权限)
	$ chmod  740  prog1.sh
Step3: 执行该shell程序
		$ prog1.sh
			prog1.sh: not found    
			(shell在标准搜索路径中找不到prog1.sh)
Step4: 指定路径或修改环境变量PATH后执行shell程序
	$ ./prog1.sh  
	2024年  11月  18日  星期一 14:52:57  CST

3.shell 程序和语句

shell 程序由零或多条shell语句构成。 shell语句包括三类:说明性语句、功能性语句和结构性语句。
(1)说明性语句:

以#号开始到该行结束,不被解释执行(注释行).

(2)功能性语句:

任意的shell命令、用户程序或其它shell程序。

复制代码
案例一:
    read从标准输入读入一行, 并赋值给后面的变量,其语法为:
    read  var   # 把读入的数据全部赋给var
    read  var1  var2  var3    # 把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ......把其余所有的词赋给最后一个变量.
    如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。

案例一

expr命令

算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。

复制代码
  $ expr  12  +  5  \*  3
  27
  $ expr  3  -  8  /  2
  -1

  $ num=9
  $ sum=`expr  $num  \*  6 `
  $ echo  $sum
  54

结构性语句

主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。

主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句等。

1)条件语句 if...then...fi

bash 复制代码
if [ 条件判断式 ];then   
    程序   
fi

# 或者(推荐)
if [ 条件判断式 ]
then
    程序
elif [ 条件判断式 ]
then
    程序
fi

1.如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。 
2.if和fi是条件语句的语句括号, 必须成对使用;
3.命令表中的命令可以是一条, 也可以是若干条。

案例:

bash 复制代码
#!/bin/bash
if [ $1 -ge 60 ]
then
    echo 及格
elif [ $1 -lt 60 ]
then
    echo "不及格" 
fi

$1 是一个特殊的变量,它代表传递给脚本的第一个命令行参数。当你在命令行中运行一个脚本,并在脚本名后面添加了一些参数时,这些参数会被存储在 $1$2$3 等变量中,其中 $1 是第一个参数,$2 是第二个参数,以此类推。

test案例

bash 复制代码
例子:    shell程序prog3.sh,  用法为:
				./prog3.sh   file
内容如下:
#The statement of if...then...else...fi
if   [  -d  $1  ]
then
echo "$1  is  a  directory"
exit          (退出当前的shell程序)
else 
if  [  -f   $1  ]
then
	echo  "$1  is  a  common  file"
else
	echo  "unknown"  
fi
fi
运行prog3.sh程序:
$ ./prog3.sh  backup
backup  is  a  directory

$ ./prog3.sh  prog1
prog1  is  a  common  file

$ ./prog3.sh  abc
unknown
prog3.sh是对prog2.sh的优化, 逻辑结构更加清晰合理!

多路分支语句

bash 复制代码
【2】多路分支语句
    (1)多路分支语句 
	 case...esac 
    		多路分支语句case用于多重条件测试, 语法结构清晰自然.  其语法为:
     		case   字符串变量   in
            		模式1)
                       		命令表1
                        	;;
            		模式2 | 模式3)   
                       		命令表2
                        	;;
             		......
            		模式n)
                       		命令表n
                        	;;
    		esac
	注:
	   1)case语句只能检测字符串变量
	   2)各模式中可用文件名元字符,以右括号结束
	   3)一次可以匹配多个模式用"|"分开
	   4)命令表以单独的双分号行结束,退出case语句
	   5)模式 n常写为字符* 表示所有其它模式
	   6)最后一个双分号行可以省略
    (2)实例
	 实例.  程序prog4.sh检查用户输入的文件名, 用法为:
         	  	./prog4.sh    string_name
		# The statement of  case...esac
	 	if   [  $#  -eq  0  ]
		then
			echo  "No argument is declared"
			exit
		fi
		case  $1  in
			file1)
				echo  "User selects file1"
				;;
			file2)
				echo  "User selects file2"
				;;
			*)
				echo  "You must select either file1 or file2!"
				;;
		esac

循环语句

1.循环语句for

当循环次数已知或确定时,使用for循环语句来多次执行一条或一组命令。循环体由语句括号do和done来限定。格式为:

bash 复制代码
for   变量名   in   单词表
        do
                命令表
        done

变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令. 循环次数由单词表中的单词数确定. 命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。

如果单词表是命令行上的所有位置参数时, 可以在for语句中省略 "in 单词表" 部分。

bash 复制代码
实例:
	实例:程序prog5.sh拷贝当前目录下的所有文件到backup子目录下.  
	使用语法为:  ./prog5.sh    [filename] 

# The statement of for...do...done
if  [  !  -d  $HOME/backup  ]
then
	mkdir  $HOME/backup
fi
flist=`ls`
for  file  in  $flist
do
	if   [  $#  =  1  ]
	then
		if   [  $1  =  $file  ]
		then
			echo  "$file  found" ;  exit
		fi
	else
		cp  $file  $HOME/backup
		echo  "$file  copied"
	fi
done
echo   ***Backup  Completed***
2.循环语句while

语法结构为:

bash 复制代码
while    命令或表达式
    do
    命令表
    done

while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,

然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

while语句的退出状态为命令表中被执行的最后一条命令的退出状态。

bash 复制代码
实例:
创建文件程序prog6,  批量生成空白文件,用法为:
				prog6   file   [number]  ./a.sh file  6
# The statement for  while
if [ $# = 2 ]
then
		loop=$2        ------>根据命令行的第二个参数来确定循环的次数
else
		loop=5
fi
i=1
while  [  $i  -lt   $loop  ]
do
		> $1$i         ------> 建立以第一个参数指定的文件名前缀,
						例如以"file"开头, 变量i的值结尾的空文件名. 参见命令cmd  >  file
		i=`expr  $i  +  1`
done
3.循环控制语句

break 和 continue

break n 则跳出n层;

continue语句则马上转到最近一层循环语句的下一轮循环上,

continue n则转到最近n层循环语句的下一轮循环上.

bash 复制代码
实例.  程序prog7的用法为:
			prog7   整数   整数   整数 ...
参数个数不确定, 范围为1~10个, 每个参数都是正整数。
	(2) if  [  $#  =  0  ]
	then
	echo  "Numeric  arguments  required"
	exit
	fi
	if  [  $#  -gt   10  ]
	then
	echo  "Only  ten  arguments  allowed"
	exit
	fi
	for  number
	do
	count=`expr  $number  %  2`
	if  [  $count  -eq  1  ]
	then
		continue
	else
		output="$output   $number"
	fi
	done
	echo  "Even  numbers:  $output "

函数的调用

bash 复制代码
(7)函数
    和其它编程语言一样,Shell 编程有系统函数和自定义函数。
    函数调用格式:
        方式1:
            value_name=`function_name  [arg1 arg2 ... ]`
        函数的所有标准输出都传递给了主程序的变量
        方式2:
            function_name  [arg1  arg2  ...  ]
            echo   $?
        获取函数的返回的状态
bash 复制代码
实例:
check_user( )    {  #查找已登录的指定用户
		user=`who  |  grep  $1 | wc -l`
		if [ $user --eq 0 ]
		then
				return  0       #未找到指定用户
		else
					return  1       #找到指定用户
		fi
}

while  true         # MAIN, Main, main:   program  begin  here
do
	echo  "Input username: \c"
	read   uname
	check_user  $uname       # 调用函数, 并传递参数uname
	if [ $? --eq  1 ]                 # $?为函数返回值
	then	echo  "user  $uname  online"
	else	echo  "user  $uname  offline"
	fi
done
相关推荐
人生苦短,菜的抠脚16 小时前
Linux 内核IIO sensor驱动
linux·驱动开发
jz_ddk17 小时前
[LVGL] 从0开始,学LVGL:进阶应用与项目实战(上)
linux·信息可视化·嵌入式·gui·lvgl·界面设计
望获linux17 小时前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
MC丶科17 小时前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
江公望17 小时前
ubuntu kylin(优麒麟)和标准ubuntu的区别浅谈
linux·服务器·ubuntu·kylin
Lynnxiaowen17 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
生态笔记18 小时前
PPT宏代码
linux·服务器·powerpoint
mucheni18 小时前
迅为RK3588开发板Ubuntu 系统开发ubuntu终端密码登录
linux·运维·ubuntu
skywoodsky18 小时前
Ubuntu 24.04环境下的挂起转休眠
linux
小云数据库服务专线18 小时前
GaussDB 应用侧报Read timed out解决方法
linux·服务器·gaussdb