shell脚本简单笔记

前言:其实shell之前有弄过,但是只是简单的学习了一下,基于linux的shell其实很好用的,一些语法也简单易懂,应该可以将其称之为一门自动化脚本语言,可以依据你的指令来执行,这个可以结合物联网来做一些自动化控制,一般可以在app或者网页端做个按钮按键或者在单片机上面做个按键,之后触发后访问linux上的服务器,在服务器里面执行相关逻辑处理并处罚自己的shell脚本,其实有挺有意思的。


shell脚本是一个包含一系列命令序列的文本文件,当运行这个脚本时,文件中包含的命令序列将得到执行。

固定格式 #!/bin/sh
首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上",这个符号表明下一行与此行会合并为同一行。
要先将脚本文件的属性改为可执行的:
chmod +x filename.sh
执行脚本的方法是:
./filename.sh


Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。在shell中,所有的变量都是由字符串组成,并且不需要预先对变量进行申明, 新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。


如果出现混淆的情况,可以使用花括号来区分,例如:
echo “Hi, $demos”
就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把 demos 当成一个变量,而 demos未被赋值,其值为空。正确的方法是:
echo “Hi, ${demo}s”

对变量的赋值直接赋值即可,使用时需要$符号。

$# 传入脚本的命令行参数个数
$* 所有命令行参数值
$0 命令本身
$1 第一个命令行参数

//注意变量赋值时,=两边都不能有空格。
方法
function fun1{
local hello=“var2”; //这个是局部变量。
echo $hello;
}
function fun1{
echo “hello $1 !”;
}
普通调用直接用 fun1;
传参调用直接用 fun2 ben;

调用函数文件:
.后面有空格
. demo.sh
//调用 callFuntion ben;
unset funname;取消载入,之后再调用就出错了。
参数读取的方式和终端读取的方式一样。
函数返回值在调用该函数后通过 $? 来获得

////函数文件demo.sh
#! /bin/bash
function callFunction(){
echo "call function $1 !";
return 1;
}


[ -f "$file" ] 判断$file是否是一个文件
[ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于
[ -x "$file" ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性
[ -n "$a" ] 判断变量$a是否有值,测试空串用-z
[ "$a" = "$b" ] 判断$a和$b的取值是否相等
[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

循环条件:
if
模板1 if [ expr ]
then
#code
fi
模板2
if [ expr ]
then
#code;
else
#code;
fi
模板3
if [ expr ];
then
#code;
elif [expr];
then
#code;
else
#code;
fi
fi

if [ $a = $b ];//a b equal?
if [ $a -gt $b ]//a>b?

for
模板1
for var in …; do
done
····· 模板2
for (( cond1; cond2; cond3 )) ;do
done


###### for循环例子1 ######
echo "for循环例子1";
for((i=1;i<=10;i++));
do
echo $i;
done;

###### for循环例子2 ######
echo "for循环例子2";
# seq 10 产生 1 2 3 。。。。10空格分隔字符串。
for i in $(seq 10);
 do
echo $i;
 done;
###### for循环例子3 ######
echo "for循环例子3";
# 根据终端输入的文件名来检查当前目录该文件是否存在
for file in $*;
do
if [ -f "$file" ];
then
echo "INFO: $file exists"
else
echo "ERROR: $file not exists"
fi
done;


while与until的区别是,while是为真时执行,until是为假时执行。
until
until [ cond1 ] && { || } [ cond2 ] …;
do
…done

###### until循环例子1 ######
echo "until循环例子1";
a=10;
until [[ $a -lt 0 ]];
do
echo $a;
((a--));
done;


while
while [ cond1 ] && { || } [ cond2 ] …; do …done

###### while循环例子1 ######
echo "while循环例子1";
i=10;
while [[ $i -gt 5 ]];
do
echo $i;
((i--));
done;
###### while循环例子2 ######
echo "while循环例子2";
# 循环读取/etc/hosts文件内容
while read line;
do
echo $line;
done < /etc/hosts;









case语句
模板
case var in
pattern 1 )
… ;;
pattern 2 )
… ;;
*)
… ;;
esac


#!/bin/bash
case $1 in
  start | begin)
    echo "start something"
    ;;
  stop | end)
   echo "stop something"
   ;;
  *)
  echo "Ignorant"
   ;;
 esac





select交互语句
select var in …; do
break;
done


#!/bin/bash
select ch in "begin" "end" "exit";
do
case $ch in
  "begin")
   echo "start something"
    ;;
 "end")
    echo "stop something"
     ;;
 "exit")
   echo "exit"
   break;
    ;;
 *)
   echo "Ignorant"
    ;;
 esac
done;
## 注意这里交互输入要输入1,2,3,而不是beign,end,exit
# $ sh demo.sh
# 1) begin
# 2) end
# 3) exit


猜你喜欢

转载自blog.csdn.net/pickers/article/details/79251939