[ 解析器 和 调用 ]
- 文件首行指定解析器,默认解析器可省略不写
- 通过 sh 或者 bash 命令调用 shell 脚本
// hello.sh
#!/bin/bash
echo "hello world"
// run
$ sh hello.sh
- 给脚本文件添加执行权限后,调用时可省略 sh 或者 bash
$ chmod 777 hello.sh
./hello.sh
[ 变量 ]
[ 常用的系统变量 ]
[ 自定义变量 ]
- A=1 // 直接定义复制,等号两侧不能有括号
- echo $A // 调取变量时需要用 $ 符号
- 变量区分大小写
- unset A // unset 命令可以释放变量
- readonly X=123 // readonly 定义静态变量,该变量无法被重新赋值,无法被释放
- export D // 将变量 D 提升为全局变量
[ 特殊变量 ]
- $n // n 为数字,$0 代表脚本自身,$1-9 代表前9个参数,大于9的需要用大括号包裹数字,如 $
- $# // 代表输入参数的个数,不包括 $0 ,例如 sh hello.sh 1,这里的 $# 就为 1
// hello.sh
echo $#
// run
$ sh hello.sh a b c // 3
- $* 和 $@,都表示所有参数,区别在于,用双引号包裹起来后,"$*" 会成为一个整体,而 "$@" 仍然可以用来遍历
- $$ 获得当前进程 ID
- $! 获得之前(上一个)进程 ID
- $? 获得之前(上一个)进程结束的状态码 (0 表示成功, 1 表示失败)
[ 运算符 ]
// cals.sh
a=$[1+2]
b=$[(1+2)*2]
c=$((2+2))
[ 条件判断 ]
- [ 条件语句 ] // 中括号内必须有首尾空格
- [ 23 -eq 22 ] // 运算符两侧必须有空格
- 整数比较
= // 等于
-lt // less than <
-le // less equal <=
-eq // equal =
-gt // greater than >
-ge // greater equsl >=
-ne // not equal !=
[ a -eq b ]
-z // 空字符串
-n // 非空字符串
== // 字符串相等
!= // 字符串不等
-r // read 有读取权限
-w // write 有写入权限
-x // execute 有执行权限
[ -w file ]
-e // existence 文件存在
-f // file 文件存在
-d // directory 目录存在
[ -d xxx ]
-a // and 与
-o // or 或
! // not 非
- 使用 [[]] 或 (()) 包裹条件表达式,可以使用 > && 之类的符号
[ 流程控制 ]
[ if ]
// 1
if [ 表达式 ]:then // 注意 if 后面的空格
// code...
elif [ 表达式 ]:then
fi
// 2
if [ 表达式 ]
then
// code...
elif [ 表达式 ]
then
// code...
fi
[ case ]
case $var in
value1)
// code 1
;;
value2)
// code 2
;;
*)
// code default
;;
esac
[ for ]
for((i=0; i<4; i++))
do
echo $i
done
[ for in ]
- 这里使用 $* 和 $@ 是一样的
- 这里只能使用 "$@",而不能使用 "$*",因为后者会把所有参数合并到一起
for i in $@
do
echo $i
done
[ while ]
i=0
while [ $i -lt 5 ] // 注意 while 后面要有 空格
do
echo $i
i=$[$i + 1]
done
[ 控制台交互 ]
[ read ]
- read [option] [var_name]
- option:
-p // 等待输入前给终端的提示内容
-t // 等待输入的时间
name=""
echo ""
read -t 2 -p "请输入姓名: " name
# if [ -n "$name" ] // 注意这里给 $name 包裹了双引号
if [ "$name" ] // 简写了,空字符串返回 false
then
echo "您的姓名是 $name"
else
echo ""
echo ""
echo " ( 0 ^ 0 ) "
echo " (< >^< >) "
echo ""
echo "您没有输入姓名哦"
echo ""
fi
[ 函数 ]
[ 系统函数 ]
- basename 获取不包含路径的文件名
- dirname 获取不包含文件名的路径
[ 自定义函数 ]
a=0
b=0
function sum()
{
a=$1
b=$2
s=$[$1+$2]
return $s
}
sum 2 3
result=$?
echo "$a + $b 的结果为 $result"