Shell脚本笔记

预备知识

shell脚本的2种执行方法

#方法一:进入当前脚本目录
chmod +x demo01.sh   #给文件赋可执行权限
./demo01.sh

#方法二:直接运行解释器
sh demo01.sh

一、Shell变量

1)变量的命名规则:只支持数字、字母和下划线(_),首个字母不能以数字开头

2)变量名和等号之间不能有空格

3)变量名的赋值方式:显式赋值或通过语句给变量赋值

4)使用变量名:在变量名前加$符,可以给变量添加{},用于使解释器区分变量名的边界

#------------------------------------------------------
# #!是一个约定的标记,它告诉系统用什么解释器执行脚本
#------------------------------------------------------
#!/bin/bash
message="Hello,world!"    #显式赋值给变量
echo -e "$message\n"  #使用变量$var  -e 激活转义字符

for skill in ECMA JAVA;do    #通过语句给变量赋值1
  echo "I'm good at ${skill}Script"   #使用变量${var}
done

for file in `pwd`;do   #通过语句给变量赋值2
  echo -e "\n$file\n"
done

for file in $(ls /etc | grep sh);do    #通过语句给变量赋值3
  echo $file
done

执行结果:

5)只读变量:使用readonly可以将变量定义为只读变量,只读变量的值不能被改变

#!/bin/bash
name="姬满广"
readonly name
name="唐波"

执行该shell脚本结果如下:

 6)删除变量:使用unset可以删除变量

name="刘建慧"
unset name
echo $name

执行该shell脚本结果为不打印name值,如下图所示: 

7)变量类型:包括全局变量与局部变量

--全局变量(环境变量)

   --i)查看全局变量的方法:env 或 export -p 命令

   --ii)定义全局变量的方法:

export  variable_name=value        #export只对当前登录有效

 或

variable_name=value

export variable_name

二 字符串和数组

1)字符串

--字符串支持单引号与双引号,也可以不用引号

--单引号字符串的限制:

    --任何字符都会原样输出,单引号字符串中的变量是无效的

    --不能出现一个单独的单引号(使用单引号的转移字符也不行),但可成对出现,作为字符串拼接使用

    相对应的

    --双引号字符串支持变量

    --双引号里可以出现单个的转义字符

--字符串拼接:可使用单引号或双引号拼接

--获取字符串长度:${#str}

--提取子字符串:${str:start:len}    #从1开始,获取从start开始的len个字符

--查找子字符串:expr index str substr   #substr可以是多个字符,能匹配substr中的任意一个即

#!/bin/bash
name="Lucy"
message1="Hello,I know your name is $name\n"   #双引号字符串支持变量
message2="Hello,I know your name is "$name"\n"   #双引号字符串拼接
message3='Hello,I know your name is $name\n'
message4='Hello,I know your name is '$name'\n'   #单引号字符串拼接
echo -e $message1
echo -e $message2
echo -e $message3
echo -e $message4
echo -e "name.length = "${#name}"\n"   #字符串长度获取
echo -e  ${name:1:2}"\n"   #截取变量中的子字符串
echo `expr index "$name" L`   #查询字符位置

执行结果:

 

 2)数组

--bash支持一维数组(不支持多维数组)

--bash不限制数组的大小

--数组的定义:用“空格”符号分隔开

--数组的索引:自0开始

array_name=(value0 value1 value2 ... valuen)

或者

array_name=(

value0

value1

value2

...

valuen

)

--读取数组: ${array_name[n]}   # n=0,1,2,......,n-1

--获取数组中的所有元素:${array_name[*]}  或  ${array_name[@]}

--获取数组的长度

    --获取数组的长度:${#array_name[*]}    或    ${#array_name[@]}

    --获取单个数组的长度:${#array_name[n]}

#!/bin/bash
array1=("" "" "" "" "" "" "" "")
array2=(
花
园
的
花
朵
真
鲜
艳
)
echo -e ${array1[7]}"\n"    #获取单个元素
echo -e ${array2[7]}"\n"    #获取单个元素
echo -e "array1长度:"${#array1[*]}"\n"    #获取数组长度
echo -e "array2长度:"${#array2[@]}"\n"    #获取数组长度
echo -e ${#array1[1]}"\n"    #获取单个字符的长度
echo -e "array1元素:"${array1[*]}"\n"   #获取数组中的所有的元素

执行结果:

 三、传参

--在执行shell脚本时,可以向脚本传递参数,脚本内获取参数的格式:$n。n代表一个数字,1标识执行脚本的第1个参数,2表示执行脚本的第2个参数,依此类推...

--需要注意的是,$10不能获取第10个参数,当n>=10时,获取参数需要使用${n}来实现

--$0表示执行的文件名

 

#/bin/bash
echo -e "执行的文件名:$0\n"
echo -e "传递的参数个数:$#\n"
echo -e "第一个参数为:$1\n"
echo -e "第二个参数为:$2\n"
echo -e "第三个参数为:$3\n"
echo -e "脚本运行的当前进程ID号:$$\n"
echo -e "脚本运行的最后一个进程的ID号:$!\n"

echo '通过带引号的$*循环输出参数:'
for i in "$*";do
  echo $i
done
echo -e "\n"

echo '通过$*循环输出参数:'
for i in $*;do
  echo $i
done
echo -e "\n"

echo '通过带引号的$@循环输出参数:'
for i in "$@";do
  echo $i
done
echo -e "\n"

echo '通过$@循环输出参数:'
for i in $@;do
  echo $i
done
echo -e "\n"

echo '通过$*输出参数:'
echo "$*"
echo -e "\n"

echo '通过$@输出参数:'
echo "$@"
echo -e "\n"

执行结果:

 四、Shell运算符

--表达式和运算符之间要有空格,如:2 + 2   //不能写成2+2

--算数运算符

a=10
b=20

echo -e "a = $a,b = $b\n"

val=`expr $a + $b`
echo -e "a+b = $val\n"

val=`expr $b - $a`
echo -e "b-a = $val\n"

val=`expr $a \* $b`
echo -e "a*b = $val\n"

val=`expr $b / $a`
echo -e "b/a = $val\n"

val=`expr $b % $a`
echo -e "b%a = $val\n"

a=$b     #赋值
echo -e "a=$a b=$b\n"

if [ $a == $b ]
then
  echo "a等于b"
fi

if [ $a != $b ]
then
  echo "a不等于b"
fi

执行结果:

--关系运算符

#/bin/bash
#author:wanwaytech
a=10
b=20

echo -e "a=$a, b=$b\n"

if [ $a -eq $b ]
then
  echo "$a -eq $b :a等于b"
else
  echo "$a -eq $b : a不等于b"
fi

if [ $a -ne $b ]
then
  echo "$a -ne $b : a不等于b"
else
  echo "$a -ne $b :a等于b"
fi

if [ $a -gt $b ]
then
  echo "$a -gt $b : a大于b"
else
  echo "$a -gt $b : a小于等于b"
fi

if [ $a -lt $b ]
then
  echo "$a -lt $b : a小于b"
else
  echo "$a -lt $b : a大于等于b"
fi

if [ $a -ge $b ]
then
  echo "$a -ge $b : a大于等于b"
else
  echo "$a -ge $b : a小于b"
fi

if [ $a -le $b ]
then
  echo "$a -le $b : a小于等于b"
else
  echo "$a -le $b : a大于b"

执行结果:

 --布尔运算符

 --逻辑运算符

#!/bin/bash
a=10
b=20
if [ $a -gt 0 -a $a -lt 100  ]
then
  echo "a>0且a<100:true"
else
  echo "a>0且a<100: false"
fi

if [ $b -le 0 -o $b -ge 100 ]
then
  echo "b<=0或b>=100:true"
else
  echo "b<=0或b>=100: false"
fi

if [[ $a -gt 0 && $a -lt 100 ]]
then
  echo "a>0且a<100:true"
else
  echo "a>0且a<100: false"
fi

if [ $b -le 0 ] || [ $b -ge 100 ]
then
  echo "b<=0或b>=100:true"
else
  echo "b<=0或b>=100: false"
fi

执行结果:

--字符串运算符

#!/bin/bash
a="abc"
b="efg"

if [ $a = $b ]
then
  echo "$a = $b:a等于b"
else
  echo "$a = $b:a不等于b"
fi

if [ $a != $b ]
then
  echo "$a != $b:a不等于b"
else
  echo "$a != $b:a等于b"
fi

if [ -z $a ]
then
  echo "-z $a:字符串长度为0"
else
  echo "-z $a:字符串长度不为0"
fi

if [ -n $a ]
then
  echo "-n $a:字符串长度不为0"
else
  echo "-n $a:字符串长度为0"
fi

if [ $a ]
then
  echo "$a:字符串不为空"
else
  echo "$a:字符串为空"
fi

执行结果:

五、echo命令与printf命令

1)echo命令

--显示不换行   echo -e "XXX\c"     # \c: 不输出后面的字符  不换行

                        echo -n “XXX”      #不换行输出

eg.echo -e "我们\c很好"    #输出我们

--显示结果定向至文件  >   >>

eg. echo "Hello test" > 1.txt   #覆盖写

      echo "Hello test" >> 1.txt   #追加写

2)printf命令

--printf  format-string [arguments ...]    #format-string:格式控制符  arguments:输出参数

--格式控制符

 六、流程控制

1、if语句

--if [elif else]语句    #elif与else均非必要

#!/bin/bash
a=10
b=20
if [ $a == $b ]
then
  echo -e "a等于b"
elif [ $a -gt $b ]
then
  echo -e "a大于b"
else
  echo -e "a小于b"
fi

执行结果:

2、for循环

#!/bin/bash
for loop in 1 2 3 4 5
do
  echo $loop
done

 

#!/bin/bash
for((i=1;i<=5;i++))
do
  echo $i
done

执行结果:

 3、while语句

#!/bin/bash
a=1
while (($a <= 5))
do
  echo $a
  let "a++"
done

执行结果:

七、函数

--shell中函数的定义格式如下:

[function] funname [()]{

    action;

    [return int;]

}

--可以带function funname()定义,也可以直接funname()定义,不带任何参数

--参数返回,可以显示如:return 返回,如果不加,将以最后一条命令运行结果,作为返回值

--函数返回值在调用函数后通过$?来获得

--$?仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再通过$?获得

#!/bin/bash
function add(){
  echo "求和运算"
  echo "请输入第一个数字:"
  read aNum
  echo "请输入第二个字符:"
  read bNum
  return `expr $aNum + $bNum`
}

add
echo "和为:$?"


function sub(){
  echo "减法运算"
  echo "请输入第一个数字:"
  read aNum
  echo "请输入第二个数字:"
  read bNum
  return `expr $aNum - $bNum`
}
sub
echo "差为: $?"

执行结果:

#!/bin/bash
function test(){
  echo "参数个数$#"
  echo "第一个参数是$1"
  echo "第二个参数是$2"
  echo "第十个参数是${10}"
}
test 1 2 3 4 5 a  7 9 13 21 77 32 11

执行结果:

八、文件包含

--文件包含方法

. filename   #注意点号(.)和文件名中间有一空格

source filename 

--demo20.sh
#!/bin/bash
url="http://www.baidu.com"

--demo21.sh
#/bin/bash
#. ./demo20.sh
source demo20.sh
echo "百度网址:$url"

执行结果:

posted @ 2019-12-03 10:42  DaveFu2018  阅读(244)  评论(0)    收藏  举报