2_14shell编程(脚本编程)

本文介绍了Shell脚本的基础知识,包括脚本文件的创建、执行权限的添加、常用的Shell命令如`echo`和`exit`。讲解了Shell脚本与编译型语言的区别,强调脚本的开发效率高和解释执行的特点。内容涵盖变量、条件判断、循环结构、函数的使用,以及在脚本中调用其他脚本和C程序的方法。此外,还涉及了在脚本中调用外部程序如`awk`进行数据处理。
摘要由CSDN通过智能技术生成
2_14shell编程(脚本编程)

像搭积木一样,一层一样

一般是my.sh .sh结尾

chmod  u+x  my.sh//添加执行权限,Linux可执行文件是以EFL开始的
//添加了执行权限之后就可以用./my.sh执行
bash my.sh  //执行

#!/usr/bin/bash            //设置解释器

echo "hello"

exit 0

c/c++ 编译型:xx.c 编译生成二进制的可执行程序,直接运行可执行程序,因为可直接运行,所以运行效率高一些。

解释性:需要解释器,通过解释器解释执行

脚本的特点:开发效率高,

Java (两种都有) xx.java 编译 xx.class(二进制) 解释器(Java 虚拟机

一处编译,到处运行。虚拟机将平台的差异抹平,不适合服务器打交道。

题将整数部分拿出来

python3不兼容python2

12.3
4.5
6.7



#!/usr/bin/bash

awk -F. '{printf $1}' file > newfile

exit 0

xx.mp4歌曲 音乐播放器(解释器),pid就是他的pid

xx.sh 文本 bash可执行程序bash(pid)

变量

本地变量,环境变量 参数变量(本质是一样的)能用就行

等号的左边和右边不能加空格

#!/usr/bin/bash
#环境变量
echo "\$$=$$"        //脚本的pid (解释器的pid)
echo "\$#=$#"   //加了\就是$ $0是参数个数
echo "\$0=$0"    //   脚本的名字
echo "\$1=$1"    //第1个变量
echo "\$2=$2"    //第2个变量
#echo $path

#本地变量

echo "input"
read line

echo "line=$line"


#stra="hello world"   //因为有空格加双引
#str=hello
#val=99                  //不知道类型,不要去考虑类型
#mystr=$str
#echo='mystr=$str'            //完样输出  '是强引用
#echo "str=$str"          //与printf等价  
#printf "$str\n"          //接了$就成变量了  \n是print里面特有的

if语句

条件:字符串,算数

if test -f fred.c
then
...
fi



if [ -f fred.c]
then
...
fi
if test -f a.py
then
	echo "a.py存在"
fi


read filename
if [ -f "$filename"]
then
	echo "$filename 存在"
else
	echo "$filename不存在"
fi



echo "input:"
read filename
if [ -d "$filename" ]
then
	echo "$filename 是文件夹"
elif [ -f "$filename" ]
then
	echo "filename 是普通文件"
else
	echo "$filename 不存在"
fi


这种语句不仅可以写在文件里,还可以写在文件外面

在这里插入图片描述
比较字符串相等

read line
if [ "$line" = 123 ]
then
	echo "=="
fi


if [ -n "$line" ]
then 
	echo "值:$line"
else
	echo "null"
fi


if [ ""$line" -lt 100 ]
then
	echo "$line < 100"
fi

if [ "$line" -lt 0 ]||[ "$line" -gt 100 ]
then
	echo "成绩不合法"
fi
#!/usr/bin/bash

echo "input"
read line

if [ $line" -lt 0 ]||[ $line" -gt 100 ] 
then
	echo "成绩不合法"
	exit 1
fi

if [ "$line" -ge 80 ]
then
	echo "A"
elif [ "$line" -ge 70 ]
then
	echo "B"
elif [ "$line" -ge 60 ]
then
	echo "C"
else
	echo "D"
fi

三种运算方法

str=`ls`   //同下
str=$(ls)    //将ls的执行结果赋值给str
echo "$str"

i=1
let "i+=1"   //对i+1
echo "i=$i"

a=$((i*3))
echo "a=$a"

a=`expr $i \* 2`

for循环 循环多少次取决于后面values的数目

for variable in values
do
	statements
done


for i in 1 2 3 
do
	echo i=$i
	sleep 1
done

for name in $(ls)   //`ls`也可以
do
	echo "filename: $name"
done

while循环 条件满足去做这件事情

while condition do
	statename
done


while [ "helle"= "hello" ]  //死循环
do
	echo "run:"
	sleep 1
done


while true
do
	echo "input"
	read line
	
	if [ "$line"= end ]
	then
		break
	fi
	
	echo "line=$line"
done


i=0
while [ "$i" -lt 10 ]
do 
	echo "i=$i"
	let "i+=1"  //((i++))     i=`expr $i+1`
done


count=0
while true
do
	echo "input"
	read line
	
	if [ "$line" = "123" ]
	then
		break
	fi
	((count++))
	
	if [ "$count" -eq 3 ]
	then
		echo "密码验证失败"
		exit 1
	fi
	
done

echo "密码验证成功"
until循环 和while刚好相反

如果条件不满足就一直执行,执行结束,就结束。

until condition
do
	statements
done


until [ -f file.txt ]
do
	echo "not find file.text"
	sleep 1
done

echo "find file.txt"

case语句

case variable 
pattern [ | pattern] ...) statements;;
pattern [ | pattern] ...) statements;;
...
esac


echo "input"
read line

case "$line" in
	yes|Y|y|Yes) echo "this is yes";;//line是yes或者后面的就执行后面的语句
	[yY][eE][sS]|[uY]) echo "this is yes";;
	no|N|n|No) echo "this is no";;
	*) echo "***"
esac



函数

在这里插入图片描述

必需写在最上面

#!/usr/bin/bash
fun()
{
	echo "fun run"
	echo "fun: \$#=$#"
	echo "fun: \$1=$1"
	echo "fun: \$2=$2"
}

fun hello 123   //调用函数   后面是参数
echo "a.sh: \$#=$#"
echo "a.sh: \$1=$1"
echo "a.sh: \$2=$2"




my_add()
{
	if [ "$#" -ne 2 ]
	then
		echo "参数有误"
		return 0
	fi
	
	res=`expr $1 + $2`
	return $res//因为已经赋值给了res,也可以不用return
}
my_add   1   3
echo "$?"//输出上一行语句的结果
r=$?
echo "$?"



my_test()
{
	local str=hello//运行完就在解释器  没有全局和局部变量 加了local就只在这个函数内部有效,外面面就还有校
	echo "my test:str=$str"
	unset str   //撤销这个变量,万一后面有定义这个变量
}
test2()
{
	echo "test2:str=$str"
}
my_test//只有这个函数执行后,解释器中才有了str这个变量
echo "str=$str"
test2



在一个脚本里面调用另一个脚本也是可以的,加上路径就可以了

#!/usr/bin/bash

echo "b.sh run pid=$$"
mystr=hello
#环境变量,可以被继承
#export mystr//将变量变成环境变量,两个脚本都可以共享,
echo "mystr=$mystr"
./d.sh  $mystr//给上路径,就可以调用其他脚本  可以把它当参数传给另一个脚本
. ./d.sh//在前面加上两个点,他们就在同一个bash里面执行,他做的可能会影响当前环境
source ./d.sh//同上
exit 0
#!/usr/bin/bash

echo "d.sh run pid=$$"
echo "d
b.sh mystr=$mystr"//在d.sh不能调用mystr,因为pid不一样,解释器不一样,变量在另一个解释器里面,如果就想在另一个脚本调用另一个脚本的变量,可以将它的变量当作参数传给另一个脚本

exit 0
. ./b.ah//同下
source ./b.sh //在当前解释器执行,如果脚本最后有exit(0),结束后这个窗口都会消失。
但是如果不在当前bash执行,bash结束脚本也就结束了,里面的变量也就不在了

在脚本中调用c程序直接调用./a.c

在c程序中调用脚本、

#include <stdio.h>
#include <stdlib.h>
#incldue <unistd.h>
#include <string.h>

int mian()
{
	printf("main pid=%d\n",getpid());
	
	execl("my.sh","my.sh",(char*)0);
	printf("execl err\n");
	
	exit(0);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值