1. Hello World
#!/bin/bash
echo "Hello World !"
运行:
- cd 到该目录下
- chmod +x ./test.sh 给脚本权限
- ./test.sh 执行脚本
2. Shell变量
定义:变量名不加美元符号($)
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
# 注意=两边不能有空格
a="aaa"
使用:在变量名前面加美元符号($)即可使用
# 两种方法
echo $a
echo ${a}
只读变量
# 将变量a定义为只读变量,只读变量不能改变
readonly a
删除变量
# 只读变量无法删除
unset b
字符串
# 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
# 单引号字串中不能出现单引号(对单引号使用转义符后也不行)
str='this is a string'
# 双引号里可以有变量
# 双引号里可以出现转义字符
str2="hello, ${a}"
3. Shell参数传递
在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。
#!/bin/bash
echo "执行的文件名:$0";
echo "第一个参数为:$1";

4. Shell数组
#!/bin/bash
# 定义数组
my_array=(A B "C" D)
# 按下标取值
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
# 数组中所有元素
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"
# 数组长度
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"
5. Shell运算
算数运算
- 运算符左右必须有空格
- 完整的表达式要被反引号(``)包含
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
# 乘号(*)前边必须加反斜杠(\)
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]; then
echo "a 等于 b"
fi
if [ $a != $b ]; then
echo "a 不等于 b"
fi
关系运算
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
#!/bin/bash
a=10
b=20
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"
fi
布尔运算
#!/bin/bash
a=10
b=20
# 与运算
if [ $a -lt 100 -a $b -gt 15 ]; then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
# 或运算
if [ $a -lt 100 -o $b -gt 100 ]; then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
逻辑运算
#!/bin/bash
a=10
b=20
# 逻辑与
if [[ $a -lt 100 && $b -gt 100 ]]; then
echo "返回 true"
else
echo "返回 false"
fi
# 逻辑或
if [[ $a -lt 100 || $b -gt 100 ]]; then
echo "返回 true"
else
echo "返回 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
文件检测运算
#!/bin/bash
file="/var/www/runoob/test.sh"
if [ -r $file ]; then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $file ]; then
echo "文件可写"
else
echo "文件不可写"
fi
if [ -x $file ]; then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -f $file ]; then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
if [ -d $file ]; then
echo "文件是个目录"
else
echo "文件不是个目录"
fi
if [ -s $file ]; then
echo "文件不为空"
else
echo "文件为空"
fi
if [ -e $file ]; then
echo "文件存在"
else
echo "文件不存在"
fi
6. Shell显示
echo命令
#!/bin/sh
# 从标准输入中读取一行,并赋给变量a
read a
# 输出变量a
echo "$a"
# -e 开启转义
echo -e "OK! \n GO"
# 结果定向到文件
echo "It is a test" > myfile
# 输出执行结果(当前时间)
echo `date`
printf命令
#!/bin/bash
# 输出 1 abc
printf "%d %s\n" 1 "abc"
7. test命令
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
# [] 执行基本的算数运算
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]; then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
8. 流程控制
if else
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
for循环
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
while循环
echo '按下 <CTRL-D> 退出'
echo -n '输入: '
while read a
do
echo "$FILM"
done
跳出循环
break:直接跳出循环体
continue:不跳出循环体,结束当前循环,继续下一次循环
case判断
取值将检测匹配的每一个选项。一旦匹配上,则执行完匹配选项相应命令后不再继续其他选项。如果无一选项匹配,使用星号 * 捕获该值。
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
9. 函数
有返回值
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
# 先定义,后使用
funWithReturn
# 调用函数后,通过 $? 来获得该函数返回值
echo "输入的两个数字之和为 $?"
有参数
#!/bin/bash
funWithParam(){
echo "第一个参数为 $1"
echo "第二个参数为 $2"
# 当n>=10时,需要使用${n}来获取参数。
echo "第十个参数为 ${10}"
echo "第十一个参数为 ${11}"
echo "参数总数有 $# 个"
echo "作为一个字符串输出所有参数 $* "
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
10. 重定向
输出重定向
# 结果写入文件,控制台不显示(覆盖方式)
echo "aaa" > file
# 结果写入文件,控制台不显示(追加方式)
echo "aaa" >> file
# 控制台不显示,内容也不写入文件
echo "aaa" > /dev/null
输入重定向
# 从文件读取输入
echo input < file
11. 文件包含
将a.sh加入b.sh中,即可在b.sh中使用a.sh中的内容
# 方法一
# 注意点号(.)和文件名中间有一空格
. filename
# 方法二
source filename
12. 调试shell脚本
sh -x test.sh
网友评论