shell脚本入门学习
基本的CentOS 7下shell命令的学习
目录
前言
shell是一个命令解释器,位于应用程序和操作系统之间
就是在操作系统和应用程序之间的命令翻译工具
一、如何执行?
CentOS 7 默认是使用 shell里的bash,shell脚本以.sh结尾,通过bash name.sh 来运行shell脚本
二、基本命令
1.helloworld
在屏幕输出helloworld
#! /bin/bash
echo "helloworld"
#!/bin/bash是指此脚本使用/bin/bash来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。
2.注释
单行注释和多行注释:
#这是一个单行注释
在前面加上 # 来注释一行
:<<字符
被注释的内容
字符
任意字符即可,不过为了方便,一般使用 !来执行多行注释
:<<!
被注释的内容
!
3.变量
普通变量 注意单引号和双引号的区别
- 变量名=变量值 #等号左右不能有空格
- 变量名=‘变量值’ #原样赋值给变量
- 变量名=“变量值” #会对引号内的值进行解析,最后结果赋值给变量
a=123
echo "${a}" #123
a='${a}'
echo "${a}" #${a}
a=10
b="${a}"
echo "${b}" #10
习惯:数字不加引号,其他加引号
命令变量
- 变量名称=‘命令’
- 变量名称=${命令}
a='date' #方法返回一个时间
echo "${a}" #输出当前时间
变量的四种写法
一般写法(非标准)
- $变量名
- “$变量名”
- ${变量名}
标准写法 "${变量名}"
readonly 变量名 (只读变量,不允许修改)
unset 变量名 (删除变量,使用后删除变量)
3.数组
直接上代码
arr=(a b c d e f g)
#输出数组对应下标的元素
echo "${arr[0]}"
echo "${arr[1]}"
#输出数组的元素
echo "数组为:${arr[*]}"
#对元素进行赋值
arr[1]=B
echo "数组为:${arr[@]}"
#输出数组的长度 前面加 #
echo "数组的长度为:${#arr[*]}"
echo "数组的长度为:${#arr[@]}"
输出结果为
a
b
数组为:a b c d e f g
数组为:a B c d e f g
数组的长度为:7
数组的长度为:7
定义数组: 等号两边不能有空格,值用空格隔开
数组名={值1 值2 值3 … 值n}
数组赋值:
数组名[数组下标]=值
获取属数组的值
${数组名[数组下标]}
获得数组的所有元素(两种写法)
${数组名[*]}
${数组名[@]}
获得数组的长度(得到数组所有长度在前面加上 # )
${#数组名[*]}
${#数组名[@]}
4.运算符
先上代码
#两数相加
num1=`expr 2 + 2`
echo "2+2的结果为:${num1}"
#两数相减
num2=`expr 2 - 2`
echo "2-2的结果为:${num2}"
#两数相乘 *在bash里属于特殊字符,有“”所有“ 的意思,需要用转义符 \
num3=`expr 2 \* 2`
echo "2*2的结果为:${num3}"
#两数相除
num4=`expr 2 / 2`
echo "2/2的结果为:${num4}"
a=10
b=12
num5=`expr ${a} + ${b}`
echo "变量 a = ${a} + 变量 b = ${b} 的值为:${num5}"
#自加(自减同理)
e=10
((e++))
echo "e++ 之后的值为 $e"
运行结果为:
2+2的结果为:4
2-2的结果为:0
2*2的结果为:4
2/2的结果为:1
变量 a = 10 + 变量 b = 12 的值为:22
e++ 之后的值为 11
通过上述代码,相信看出了运行格式
expr`变量 运算符 变量`
特别注意的是 expr两边的符号是 table键上面的引号,并不是平常我们写的单引号,并且运算中间必须用空格隔开
*在bash里属于特殊字符,运算时需要用 \来进行转义
5.字符串运算符
先上代码
a="aaa"
b="bbb"
# $?可以获取上一条的返回结果
[ "${a}" = "${b}" ]
echo "判断字符串是否相等,相等为0,否则为1 :$?"
[ "${a}" != "${b}" ]
echo "判断字符串是否不相等,不相等为0,否则为1:$?"
[ -z "${a}" ]
echo "判断字符串的长度是否为0,为零返回0,否则为1:$?"
[ -n "${a}" ]
echo "判断字符串的长度是否不为0,不为零返回0,否则为1:$?"
[ $"${a}" ]
echo "判断字符串是否为空,《不为空》 返回0,否则为1:$?"
echo "输出字符串的长度为:${#a}"
运行结果为
判断字符串是否相等,相等为0,否则为1 :1
判断字符串是否不相等,不相等为0,否则为1:0
判断字符串的长度是否为0,为零返回0,否则为1:1
判断字符串的长度是否不为0,不为零返回0,否则为1:0
判断字符串是否为空,《不为空》 返回0,否则为1:0
输出字符串的长度为:3
通过上述代码格式为:(两边必须有空格)
[ 变量a 运算符 变量b ]
# $? 可以获取上一条的返回结果
= 、!= 和一般代码运行格式一样,判断是否为空为 -z (zero) ,判断不为空为 -n (nozero)
一般情况下,返回值和名称相同,返回0 表示true ,1为false
例如 != 不相等返回 0(true) ,相等为 1(false)
判断是否为空比较特殊,不为空返回 0 (true) ,为空则为 1 (fasle)
6.关系运算符
先上代码
#判断大小必须为数字
#判断大小必须为数字
a=10
b=12
echo "a=${a} , b=${b}"
[ "${a}" -eq "${b}" ]
echo "判断是否相等,相等返回0,否则为1:$?"
[ "${a}" -ne "${b}" ]
echo "判断是否不相等,不相等返回0,否则为1:$?"
#-gt (greate than) 大于
#-lt (less than) 小于
#-ge (greate equals) 大于等于
#-le (less equals) 小于等于
输出结果
a=10 , b=12
判断是否相等,相等返回0,否则为1:1
判断是否不相等,不相等返回0,否则为1:0
格式:(同字符串运算)
[ 变量a 运算符 变量b ]
特别要注意的是
首先比较必须为数字,否则在运行时将会报 “期待整数表达式” 的错误
运算符为:
- -eq (equal) 相等
- -nq (noequal) 不相等
- -gt (greate than) 大于
- -lt (less than) 小于
- -ge (greate equals) 大于等于
- -le (less equals) 小于等于
7.布尔运算符
先上代码
a=10
b=20
[ ! "${a}" -eq "10" ]
echo " ! 对结果进行取反 $?"
# -o or a < 5 || b > 10
[ "${a}" -lt 5 -o "${b}" -gt 10 ]
echo "-o 或运算 $?"
#-a and a < 5 && b > 10
[ "${a}" -lt 5 -a "${b}" -gt 10 ]
echo "-a 或运算 $?"
运行结果为
! 对结果进行取反 1
-o 或运算 0
-a 或运算 1
格式:(同字符串运算)
[ 变量a 运算符 变量b ]
了解-o (or) 或运算 , -a (and) 且运算 , ! 取反运算 (前面必须有空格)
8.逻辑运算符
先上代码
a=10
b=20
#TRUE 为 0 FALSE 为1
[[ "${a}" -lt 100 && "${b}" -gt 100 ]]
echo "&&逻辑且的运行结果为:$?"
[[ "${a}" -lt 100 || "${b}" -gt 100 ]]
echo "||逻辑或的运行结果为:$?"
运行结果为
&&逻辑且的运行结果为:1
||逻辑或的运行结果为:0
格式 注意,逻辑运算符和其他运算符格式不同
[[ true && true ]] # 与运算 返回 0 (true)
[[ false || false ]] # 或运算 返回 1 (false)
9.if判断
先上代码
a=10
b=20
if [ "${a}" -lt "100" ]
then
echo "a < 100"
fi
if [ ! "${a}" -lt "100" ]
then
echo "a > 100"
else
echo "a < 100"
fi
if [ ! "${a}" -lt "100" ]
then
echo "a > 100"
elif [ "${b}" -gt 10 ]
then
echo "b > 10"
else
echo "a < 100"
fi
输出结果为;
a < 100
a < 100
b > 10
可以看到,if的格式有三种
#简单的if判断
if [ 判断条件 ]
then
执行代码
fi
#if else 判断
if [ 判断条件 ]
then
执行代码
else
执行代码
fi
if [ 判断条件 ]
then
执行代码
elif [ 判断条件 ]
then
执行代码
else
执行代码
fi
注意
- if为开始标志,反过来写的 fi 为结束标记
- if 和 elif 下面需 then
10.选择语句
先上代码
a="hello"
case "${a}" in
"world")
echo "世界"
#相当于 break,必须要加上
;;
"hello")
echo "你好" ;;
#相当于 default 当上述条件都不满足时执行,不是必须的
*)
echo "其他"
;;
esac
运行结果为:
你好
选择语句的语法为:
case 值 in
结果1)
执行代码
;;
结果2)
执行代码
;;
esac
或者加上 default 判断
case 值 in
结果1)
执行代码
;;
结果2)
执行代码
;;
*)
执行代码
;;
esac
注意 ;; 必须添加
11.for 循环
先上代码
for var in a b c d
do
echo "${var}"
done
#{1..10} 表示从1到10
for var in {1..10}
do
echo "${var}"
done
结果为
a
b
c
d
1
2
3
4
5
6
7
8
9
10
for循环的语法为:
for 变量 in 范围
do
执行代码
done
注意
- 范围 可以直接写 A B C D这样直接赋值的
- 也可以写 {n…m} 表示从n到m
- do表示循环开始, done表示循环结束
12.while 循环
先上代码
a=1
while [ "${a}" -le 10 ]
do
echo "${a}"
((a++))
done
运行结果为
1
2
3
4
5
6
7
8
9
10
while循环的语法结构为:
while [ 判断 ]
do
执行语句
done
类似于for循环,在使用时注意判断语句内变量的变化,否则可能导致死循环
13.shell函数 (方法)
先上代码
#无参无返回值
method1(){
echo "hello world"
}
#有参无返回值
method2(){
echo "第一个参数为:$1"
echo "第二个参数为:$2"
}
#有参有返回值
method3(){
echo "$1 + $2 的值:"
return $(($1 + $2))
}
method1
echo "---------函数一执行了--------"
method2 "12" "13"
echo "---------函数二执行了--------"
method3 20 10
echo "$?"
echo "---------函数三执行了--------"
执行结果为:
hello world
---------函数一执行了--------
第一个参数为:12
第二个参数为:13
---------函数二执行了--------
20 + 10 的值:
30
---------函数三执行了--------
一共三总定义方式
#无参无返回
函数名(){
执行代码(函数体)
}
#有参无返回
函数名(){
执行代码(函数体)
#输出第一个参数
echo "$1"
#输出第n个参数
echo "$n"
}
#有参有返回
函数名(){
执行代码(函数体)
return $((返回值))
}
- 在使用函数时,直接用函数名调用即可,若是有参函数 在后面 直接写上参数 ,例如 method 值1 值2
- 在有参函数中,通过 $n 来获取第n个传递过来的参数
三、练习
要求 输入两个数,并且输入运算符,进行加减乘除运算 (除法不考虑分母为零的情况)
可以通过 read 变量 来获取从键盘输入的值
需要判断 输入的运算符,并且计算出相应的结果
代码可以这样写:
method(){
cou=0
echo "请输入第一个数:"
read num1
echo "请输入运算符数:"
read operation
echo "请输入第二个数:"
read num2
case "${operation}" in
'+') cou=`expr ${num1} + ${num2}`
;;
'-') cou='expr ${num1} - ${num2}'
;;
'*') cou=`expr ${num1} \* ${num2}`
;;
'/') cou=`expr ${num1} / ${num2}`
;;
*) echo "${operation} 输入有误"
;;
esac
return ${cou}
}
method
echo "最后的结果为:$?"
运行结果
请输入第一个数:
10
请输入运算符数:
+
请输入第二个数:
20
最后的结果为:30
对上述知识的简单总结,如果你看到这里了,何不点个赞再走。
四、总结
如果全部看完,并且能够融汇贯通,表示shell脚本你已经入门了,未来还有更加高深的代码需要学习,本人主要学习java程序,对于shell脚本只学习到这里,如果你有更好的方法,欢迎一起交流学习。若对上述结果有任何不同观点,也欢迎一起探讨。