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);
}