shell学习笔记
条件测试
命令test 或[ 表达式 ] 判断逻辑,0表示TRUE,1表示FALSE
$?: 最后一次返回结果
var=56
test $var -gt 3
ehco $?
返回结果为:0 ,结果为真
常用测试命令:
[ -d DIR ] 目录判断
[ -f FILE ] 文件判断
[ -z STREING ] STRING的长度等于0为真
[ -n STRING ] STRING的长度不为0为真
[ ARG1 OP ARG2 ] ARG1/2是整数或取值为整数的变量。
OP 包含如下逻辑符号
-eq 等于
-ne 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
注:
[ 表达式 ] 表达式和[]之间必须有空格
逻辑运算:
! 逻辑反
-a 逻辑与
-o 逻辑或
注:
应该把边变量取值放在双引号中
分支
if/then/else/elif/fi
#! /bin/bash
if [ -d test_test ]; then
echo "It's a dir"
elif [ -f test_test ]; then
echo "It's a file"
else
printf "unkonwn\n"
fi
if 后可以不用;但是那样then需要换行写
read可以等待用户输入
case/esac
没有switch,break用;;代替
#! /bin/bash
read YES_OR_NO
case "$(YES_OR_NO)" in
yes|y|Yes)
echo "hello";;
[nN]*)
echo "byebye";;
*)
echo "error input"
exit 1;;
esac
exit 0
循环
for
for ITERM in $(ls); do
printf "ITERM "
if [ -d "$ITERM" ]; then
echo "It's a DIR"
elif [ -f "$ITERM" ]; then
echo "It's a file"
fi
done
while
while [ ARG ]; do
done
break 和continue
break[n]可以跳出基层循环;
continue跳过本次循环
位置参数和特殊变量
$0 相当于main函数的argv[0]
$1、$2、$3 … 函数参数
$# 参数的个数
@
,
@ ,
@,* 所有参数列表
$? 上一条命令的exit status
$$ 当前进程号
shift:变量出队,$1先出队,调一次,一个变量出队,$2–>$1
输入输出
echo [opt] string
-e 解析转移字符
-n 不回车换行
管道 |
把一个命令的输出传递到另一个命令做输入
tee
tee命令把把结构输出到标准输出,并保存一份到文件中。
df -k | tee a.txt
tee -a a.a.txt 表示追加
文件重定向
cmd > file 标准输出重定向
cmd >> file 追加
cmd > file 2>&1 标准出错重定向到1所指的file里,2为标准出错,1位标准输出。
cmd >> file 2>&1 追加
cmd < file1 > file2 输入重定向到file1 ,输出重定向到file2
cmd < &fd 把文件描述符fd作为标准输入
cmd > &fd 把文件描述符fd作为标准输出
cdm < &- 关闭标准输入
函数
#! /bin/bash
echo $0 #当前函数的进程名
echo $1 #命令行参数
echo $2
foo()
{
echo $0 #当前函数的进程名
echo $1 #函数参数
echo $2
}
foo 11 22 #函数调用,入参11 22
shell脚本调试方法
-n 读一遍脚本,当不执行。检查语法错误用。
-v 一边执行脚本,一边将执行过的脚本命令打印到标准错误输出。
#! /bin/bash -v
-x 提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。指定某一些命令显示。
在这里插入代码片