Shell 编程基础
2021-08-01 本文已影响0人
芝兰之室也
概念:
实际上是一个应用程序,是人与Unix系统进行交互的接口;编写脚本时,也可以理解成一种命令语言或者程序语言。
Shell种类:
Shell应用程序Shell脚本编程不需要额外的安装编译器,它可以直接用编辑器直接编辑,然后直接在Shell上直接运行即可。通常,我们在编写脚本时,在第一行需要用#!来指定解释器来运行Shell脚本,比如,#!/bin/sh。
1、变量定义
(1) 变量的默认数据类型是字符串类型;
(2) 等号=和变量及被赋的值之间不能有空格;
(3) 数据运算用$[运算表达式]形式;
2、字符串操作
- 获取字符串的长度:${#变量};
- 截取字符串:${变量:x:y};
- 替换字符串中子字符串:${变量/子字符串/替换的字符串};
- 删除字符串中的子字符串:可以通过替换子字符串的方法实现,${变量/子字符串/};;
- 字符串大小写替换:^^转换成大写;,,转换成小写;
#!/bin/bash
a="Hello World"
echo ${#a} #获取字符串长度
echo ${a:6:3} #从下标6开始截取3字
echo ${a/ll/hh} #将字符串中的ll替换为hh
echo ${a/or/} #删除子字符串or
echo ${a^^} #全部转化成大写
echo ${a,,} #全部转化成小写
3、数字运算
命令方式主要有let declare expr等命令;
let 命名后直接跟上运算表达式即可:
a="4"
b="2"
let c1=${a}+${b}
echo "a + b =" ${c1}
expr 注意两点:
- 运算符和两边的变量需要使用空格隔开;
- 需要注意需要将*转义为*。
#!/bin/sh
a=4
b=2
c1=$(expr ${a} + ${b})
echo "a + b =" ${c1}
declare -i ,将变量声明为整数型:
#!/bin/sh
a="4"
b="2"
declare -i c1=${a}+${b}
echo "a + b =" ${c1}
自增自减:
let c1++
echo "c1 =" ${c1}
小数运算:在默认情况下shell是不支持小数运算,可以借助Linux平台下的bc计算器进行小数运算。
a=1.411
b=1.332
c1=`echo "$a+$b"|bc`
c4=`echo "scale=3;$a/$b"|bc` #scale用来指定小数的位数
echo $c1
echo $c4
4、数组
- 声明数组:array=(value1 value2 value3 ...)
- 访问元素:array[0]
- 访问所有元素:array[*] 或者 array[@]
- 获取数组长度:#array[*] 或者 #array[@]
a=(hello world code)
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[*]}
echo ${a[@]}
echo ${#a[*]}
5、数值关系运算
- 等于:-eq,equal
- 不等:-ne,not equal
- 大于:-gt,greater than
- 小于:-lt,less than
- 大于等于:-ge,greater equal
- 小于等于:-le,less equal
注意:
中括号两边是有空格隔开,运算符和变量之间也有空格隔开
#!/bin/sh
a=1
b=2
if [ $a -eq $b ];then
echo "yes"
else
echo "no"
fi
6、字符串关系元算
- =:判断两个字符串是否相等,相等则为真,
[ $a = $b ]
; - != 判断两个字符串是否不相等,不相则为真,
[ $a != $b ]
; - -z 判断字符串长度是否为0,如果是则为真,
[ -z $a ]
; - -n 判断字符串长度是否不为0,如果是则为真,
[ -n "$a" ]
; - 美元符号判断字符串是否为空,如果不为空则为真,
[ -n "$a" ]
;
#!/bin/sh
a="hello"
b="hello"
echo "a = b ?"
if [ $a = $b ];then
echo "yes"
else
echo "no"
fi
7、逻辑运算
- 与:&&
- 或:||
8、条件语句
- if else then elif fi 语句
a=2
if [ $a == 1 ];then
echo "a = 1"
elif [ $a == 2 ];then
echo "a = 2"
else
echo $a
fi
- case in esac 语句
#!/bin/sh
read -p "please in put a number:" num
case $num in
"1")
echo "Start 1th flow"
;;
"2")
echo "Start 2th flow"
;;
*)
echo "Do nothing"
esac
9、循环语句
- for
a=("hello" "world" "hello" "shell")
for((i=0;i<4;i++))
do
echo ${a[i]}
done
a=("hello" "world" "hello" "shell")
for v in ${a[*]}
do
echo $v
done
- while
a=("hello" "world" "hello" "shell")
i=0
while [ $i -lt 4 ]
do
echo ${a[i]}
let i++
done
与while循环恰好相反的循环until循环,在until循环中条件表达式不成立才会进入循环。
- until
a=("hello" "world" "hello" "shell")
i=0
until [ $i -ge 4 ]
do
echo ${a[i]}
let i++
done
对于until循环语句来说,一般没有上面的几种循环语句较为常用。
- select
特殊的循环select,每行打印前面都有一个序号,通常和case...in语句一起使用。
a=("公司A" "公司B" "公司C" "公司D")
select v in ${a[*]}
do
case $v in
"公司A")
echo "恭喜您,你选择了公司A !"
break
;;
"公司B")
echo "恭喜您,你选择了公司B !"
break
;;
"公司C")
echo "恭喜您,你选择了公司C !"
break
;;
"公司D")
echo "恭喜您,你选择了公司D !"
break
;;
*)
echo "您没有选择任何一个公司,请重新选择!"
esac
done
10、函数
function test1() {
echo "this is a function"
return 0
}
test1 #调用函数
输入参数:
function test2() {
echo "parameter1 : $1"
echo "parameter2 : $2"
return 3
}
test2 1 2 #调用函数
echo $? #获取函数返回值
- 函数名中是不要定义形参的,在调用时在函数后面加上实参就可以了。
- 函数体中可以通过$加参数编号访问参数,比如,第一个参数$1,到第十个参数以上就需要加上{}符号,比如${10};
- 函数返回值需要在调用该函数后通过$?获得。
11、文件包含
有的时候某个功能可能被多个脚本使用,这时就需要在将这个功能放到一个公共的文件中,需要这个功能的脚本直接包含这个公共的文件即可,这就是文件的包含,同样的Shell也是支持文件包含的。
使用.或source加上文件名来包含文件
先建一个文件test_one.sh:
#test_one.sh
var1=1
再建一个文件test_two.sh:
#test_two.sh
var2=2
再建一个文件,包含test_one.sh和test_two.sh这两个文件:
source ./test_one.sh
source ./test_two.sh
echo "file one var1=${var1}"
echo "file two var2=${var2}"