一 基本语法
1 变量
变量分为环境变量和本地变量
- 定义变量
VAR=hello # 等号两侧没有空格
echo $VAR # 获取变量值
- 声明为环境变量
export VAR # 将本地变量声明为环境变量
env | grep $VAR # 从 env 中获取 VAR 变量
- 删除变量
unset VAR
2 命令代换
# 输出date命令
DATE=`date` # or DATE=$(date)
echo $DATE
3 算数代换
echo $[10+20] # 30
echo $[2#10+11] # 13 二进制的10 和 十进制的11 相加
VAR=45
echo $[$VAR+10] # 55 or echo $[VAR+10] or echo $((VAR+10)) or echo $(($VAR+10))
4 转义字符
touch \$\ \$file
touch -- -abc
rm -- -abc
touch ./--abc
rm ./--abc
5 单双引号
VAR=`date`
echo "$VAR" # 2021年 04月 07日 星期三 22:54:48 CST
echo '$VAR' # $VAR
二 Shell 脚本语法
1 条件测试
注:判断变量时候最好带上双引号
# 整数或者取值为整数的变量:-eq(等于) -ne(不等于) -lt(小于) -le(小于等于) -gt(大于) -ge(大于等于)
VAR=50
test $VAR -eq 50
echo $? # 0
test $VAR -ne 50
echo $? # 1
test $VAR -gt 30
echo $? # 0
[ $VAR -lt 10 ] # 等价于 test $VAR -lt 10
echo $? # 1
# 目录,文件-d(目录) -f(普通文件)
[ -d testdir ]
echo $? # 0
[ -f testfile ]
echo $? # 0
# 字符串或者取值为字符串的变量 -z(字符串长度为零) -n(字符串长度非零) =(相等) !=(不相等)
VAR=hello
[ -z $VAR ]
echo $? # 1
[ -n $VAR ]
echo $? # 0
VAR= # 空值
[ -n $VAR ]
echo $? # 0
[ -n "$VAR" ] # 判断变量时候最好带上双引号,防止出错
echo $? # 1
VAR1=hello
VAR2=hello
[ $VAR1 = $VAR2 ] # 判断变量时候最好带上双引号,防止出错
echo $? # 0
[ $VAR1 != $VAR2 ]
echo $? # 1
# 与或非 -a(与) -o(或) !(非)
VAR=hello
[ -d testdir -a "$VAR" = "hello" ]
echo $? # 0
2 分支
- if 语句(模糊匹配)
#! /bin/bash
# 判断传入的是文件还是目录
echo "please enter the test content: "
read content # 读取输入
if [ -d "$content" ]; then
echo "it is dir"
elif [ -f "$content" ]; then
echo "it is file"
else
echo "unkown"
fi
- case 语句(精准匹配)
#! /bin/bash
# 判断传入的是yes或no
echo "please enter your choice(yes/no): "
read BUF
case "$BUF" in
yes|y|Y|Yes)
echo "yes!"
;;
[nN]?)
echo "no!"
;;
*)
echo "unkonwn"
;;
esac
3 循环
- for循环
#! /bin/bash
# 判断ls列举的内容是目录还是文件类型
for MYFILE in `ls`; do
if [ -d "$MYFILE" ]; then
echo "$MYFILE is a dir"
elif [ -f ""$MYFILE ]; then
echo "$MYFILE is a file"
else
echo "$MYFILE is others"
fi
done
- while 循环
#! /bin/bash
# 判断输入的密码是否正确,并且有尝试的次数限制
COUNT=2
echo "enter your password: "
read PWD
while [ "$PWD" != "yorick" -a $COUNT -gt 0 ]; do
echo "you have only $COUNT times,try again: "
read PWD
COUNT=$[COUNT-1]
done
if [ $COUNT -eq 0 ]; then
echo "fault"
exit 1
fi
echo "success"
4 位置参数和特殊变量
#! /bin/bash
echo $0 # argv[0]
echo $1 # argv[1]
echo $2 # argv[2]
echo $3 # argv[3]
shift # 参数左移
shift
echo $0
echo $1
echo $2
echo $3
echo $@ # 显示参数列表 argv[1] argv[2] ...
echo $# # 参数个数 argc-1
echo $$ # 当前进程号
# 测试
./t5.sh aa bb cc dd ee ff
# result
./t5.sh
aa
bb
cc
./t5.sh
cc
dd
ee
cc dd ee ff
4
56334
5 输入输出
- echo
-e 解析转义字符
-n 不回车换行,默认情况echo回显的内容后面跟一个回车换行
- tee
# 把结果输出到标准输出的同时,另一个副本输出到相应文件
ls -l | tee out # 即输出到屏幕,又复制到out文件
- 文件重定向
cmd > file # 标准输出重定向到file
cmd >> file # 追加file
cmd > file 2>&1 # 标准出错也重定向到file
cmd >> file 2>&1
cmd < file1 > file2 # 把file1输入到标准输出,再重定向到file2
6 函数
#! /bin/bash
# 判断目录是否存在,不存在则创建
is_dir()
{
DIR_NAME=$1
if [ ! -d "$DIR_NAME" ]; then
return 1
else
return 0
fi
}
for DIR in "$@";do
if is_dir "$DIR";then
:
else
echo "$DIR doesn't exist,creating it now..."
mkdir $DIR > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "cannot create directory $DIR"
exit 1
fi
fi
done
7 调试
#! /bin/bash -x
# 调试
is_dir()
{
DIR_NAME=$1
if [ ! -d "$DIR_NAME" ]; then
return 1
else
return 0
fi
}
for DIR in "$@";do
set -x # 调试
if is_dir "$DIR";then
:
else
echo "$DIR doesn't exist,creating it now..."
mkdir $DIR > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "cannot create directory $DIR"
exit 1
fi
fi
set +x # 调试
done
三 正则表达式
1 字符类
image-20210408160140494.png2 数量限定符
image-20210408161058778.png3 位置限定符
image-20210408161130066.png4 其他特殊字符
image-20210408162036080.png# egrep "正则" 文件
# or grep -E "正则" 文件
egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}$" regexDemo
网友评论