#! /bin/bash
#
三种不同的执行方式
#1、./ a.sh 2、sh a.sh 3、source a.sh
#区别:前两者产生新进程 后者直接在当前bash中执行
#ping www.baidu.com 测试
# 简单的输出语句
echo 'hello world'
TODO: Shell变量
## 命名规则与c语言相同
## 局部变量、环境变量、shell变量
# 调用环境变量
echo $name
echo ${name}
# export定义环境变量 否则为局部变量 【在bash中定义】
export age=10
# 只读变量 【在bash中修改变量权限】
readonly age
# 删除变量 【不能删除只读变量】
unset name
TODO: Shell字符串
## 可以是单引号、双引号、也可不加引号
#单引号 原样输出 成对存在
echo 'hello world'
##双引号 可存在变量 可存在转义字符 如$
echo "HELLO"
#字符串的拼接 -- 双引号
name='world'
name1="hello, "$name"!"
name2="hello, ${name}!"
#echo $name1 $name2
#字符串的拼接 -- 单引号
name='world'
name1='hello, '$name'!'
name2='hello, ${name}!' #hello, ${name}!
#echo $name1 $name2
#字符串的长度
school="easthome"
echo ${#school} #显示长度:8
echo ${school:1:4} #截取长度:asth 表示从第1个单位开始取4个单位长度
TODO: Shell数组
## 支持一维数组(不支持多维数组) 并且没有限定数组的大小
# 定义数组:括号表示数组,数组元素用【空格】分隔
# 数组名=(值1 值2...值n)
favs=("a1" "a2" "a3")
# 读取数组 ${数组名[下标]} 【从0开始 值 >= 0】
fav=${favs[0]}
# 读取所有元素 下标值:@
echo ${favs[@]}
# 获取数组的长度
len1=${#favs[@]}
len2=${#favs[*]}
echo "favs[0]=$fav len1=$len1 len2=$len2"
TODO: Shell注释
# 单行注释:#
# 特殊的多行注释
:<<EOF
注释内容。。。
注释内容。。。
注释内容。。。
EOF
:<<!
注释内容。。。
注释内容。。。
注释内容。。。
!
TODO: Shell算数运算符
## expr表达式计算工具
a=10
b=20
算数运算符:
加减乘除取余【+ - * / %】
val=expr $a + $b
echo “a + b = $val”
# 也称算数运算符:== !=
if [ $a == $b ] #【[] 内侧都有空格】
then
echo “a 等于 b”
fi
#关系运算符只支持数字,不支持字符串,除非字符串的值是数字
关系运算符:
等于、不等于、大于、小于、大于等于、小于等于
# -eq -ne -gt -lt -ge -le
if [ $a -eq $b ]
then
echo “a 等于 b”
else
echo “a 不等于 b”
fi
布尔运算符:
!= -a且 -o或 !非
a=10
b=20
# 1
if [ $a == $b ]
then
echo “a == b”
else
echo “a != b”
fi
# 2
if [ $a -lt 50 -a $b -gt 20 ]
then
echo “a 小于 50 且 b 大于 20 : 返回 True”
else
echo “a 小于 50 且 b 大于 20 : 返回 False”
fi
逻辑运算符:
&& ||
a=10
b=20
if [[ $a -lt 100 && $b -gt 10 ]]
then
echo “a 小于 100 并 b 大于 10 :返回 true”
else
echo “返回 false”
fi
字符串运算符:
!= -z为0 -n不为0
a=“abc”
b=“efg”
#1
if [ $a = $b ]
then
echo “a 等于 b”
else
echo “a 不等于 b”
fi
#2
if [ -z $a ]
then
echo “长度为0”
else
echo “长度不为0”
fi
#3
if [ $a ]
then
echo “不为空”
else
echo “为空”
fi
文件测试运算符
r可读 -w可写 -x可执行 -f普通文件 -s是否空 -e 是否存在
file=“/home/u200/bash”
if [ -r $file ]
then
echo “可读”
else
echo “不可读”
fi
TODO: echo打印数据
## 用于字符串的输出
# 显示转义字符
echo "\"hello world\""
# 显示变量
name="wuhu"
echo "$name yeihu"
# 显示换行
echo -e "ok! \n"
echo "---1"
# 显示不换行
echo -e "ok! \c"
echo "---2"
# 显示结果定向至文件
echo "wuhu" > myfile
# 原样输出字符串
echo '$name\'
# 显示命令执行结果
echo `date`
TODO: test命令
## 用于检查条件是否成立,可以进行数值、字符和文件的测试
# 类似于 if
a=10
b=20
if test $[a] -eq $[b]
then
echo ‘两个数相等’
else
echo ‘两个数不相等’
fi
TODO: Shell流程控制
## if语句
a=10
b=20
if [ $a == $b ]
then
echo "a等于b"
elif [ $a -gt $b ]
then
echo "a大于b"
elif [ $a -lt $b ]
then
echo "a小于b"
else
echo "没有符合的条件"
fi
TODO: case 语句
## 多选择语句,可以匹配一个值与一个模式
echo '输入1~4之间的数字:'
#read num # 监测键盘的输入
num=1
case $num in
1) echo '模式1'
;;
2) echo '模式2'
;;
3) echo '模式3'
;;
*) echo '没有其选项'
;;
esac
TODO: for 循环
## 当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值
## 命令可为任何有效的shell命令和语句,in列表可以包含替换、字符串、文件名
## in列表是可选的,如果不用它,for循环使用命令行的位置参数
:<<EOF
for var in item1 item2 ...itemn
do
command1
command2
...
commandn
done
EOF
#1
for loop in 1 2 3 4
do
echo "The val is : $loop"
done
#2
for str in 'this is a str', 'hello world'
do
echo $str
done
TODO: while循环
## 用于不断执行一系列的命令,也用于从输入文件中读取数据;命令通常为测试条件
:<<EOF
while condition
do
command
done
EOF
#1
# bash let 命令,用于执行一个或多个表达式,变量计算中不需要加上$来表示变量
i=1
while(( $i<=5 ))
do
echo $i
let "i++"
done
#2
# 无限循环
:<<EOF
while ture
do
command
done
EOF
TODO: break
## 比如
:<<!
while :
do
echo -n “输入1到5之间的数字:”
read num
case $num in
1|2|3|4|5) echo “你输入的数字为 $num!”
;;
*) echo “输入错误游戏结束!”
break
;;
esac
done
!
TODO: continue
## 比如
:<<!
while :
do
echo -n “输入1到5之间的数字:”
read num
case $num in
1|2|3|4|5) echo “你输入的数字为 $num!”
;;
*) echo “输入错误!”
continue
;;
esac
done
!
TODO: shell函数
## 可以用户自定义函数,然后在shell脚本中可以随便调用
## 可以带function fun()定义,也可直接fun()定义,不带任何参数
## 参数返回,可以显示加:return返回,如果不加,将以最后一条命令作为运行结果,作为返回值
## return后跟数值n(0~255)
第一个函数
demofun(){
echo “This is my function!”
}
echo “函数start…”
demofun
echo “函数over!”
函数返回值
funwithReturn(){
# 求和
echo “输入第一个数字:”
read anum
echo “输入第二个数字:”
read bnum
return
(
(
((
((anum+$bnum))
}
# num=funwithReturn 或着
funwithReturn
# 函数返回值在调用该函数后通过 $? 来获得
echo “funwithReturn 返回值为 $?”
函数参数
funwithparam(){
echo “第一个参数 $1!”
echo “第二个参数 $2!”
echo “第十个参数 $10!” # 多位数要加上{}
echo “第十个参数 ${10}!”
echo “参数总数有 $# 个!”
echo “作为一个字符串输出所有参数 $*!”
}
funwithparam 1 2 3 4 5 6