Shell 跟踪选项
脚本中加入 set -x 那么set 命令之后执行的每一条命令以及加在命令行中的任何参数(包括变量和变量的值)都会显示出来。
每一行之前都会加上加号 + 提示他是跟踪输出的标识。
在子shell中执行的shell跟踪命令会加两个加号 ++
set +x 就是关闭 跟踪
#!/bin/sh
set -x
echo -n "YES OR NO"
read answer
answer=`echo $answer | tr [a-z] [A-Z]`
+ echo -n 'YES OR NO'
YES OR NO+ read answer
Y
++ tr '[a-z]' '[A-Z]'
++ echo Y
+ answer=Y
Shell 脚本输出项
在代码中使用echo 和print 输出 打印日志
echo $1
根据层次控制输出
在脚本的开始设置一个变量 脚本运行时测试该变量 然后根据该变量的值决定是显示还是禁止调试指令,
使用echo 后需要注释 使用下面的只需要更改参数就能分层次 或不输出
#!/bin/sh
debug=2
test $debug -gt 0 && "A"
test $debug -gt 1 && "B"
test $debug -gt 2 && "C"
用函数简化错误检查
按照惯例,成功执行的指令将把shell 变量 “$?” 赋值 为 0
使用函数 “$?” 作为第一个参数 报告内容作为第二个参数
alert () {
# usage: alert
if [ "$1" -ne 0 ]
then
echo "WARNING : $2 执行失败 " >&2
exit $1
else
echo "INTO: $2 执行成功" >&2
fi
}
mv $file1 $file2
alert $? "mv $file1 $file2"
使用函数实现shell 中间暂停 或单步执行
alert () {
echo "Press [Enter] to continue" >&2; read x
}
时间日期
#!/bin/sh
second=`date +'%S'`
minute=`date +'%M'`
hour=`date + '%k'`
day=`date +'%d'`
month=`date +'%m' | sed 's/0*//'`
year=`date + '%Y'`
weekday=`date +'%w'`
参数个数 $#
比较 测试
-eq =
-ne !=
-gt >
-ge >=
-lt <
-le <=
test 和 方括号好弧 可以替用 [ ] 表示执行的结果是否为真
&& 与 两边可以是条件 也可以是函数 代码 前面的执行成功 才会执行后面语句
|| 或 前面的执行失败 才会执行后面语句
[ ] 中的-a 是与
[ ]中的-o 是或
if [ -n $1] 和 if [ $1 ] 都是判断参数是否已定义
if [ -z $1] 和 if [ ! $1 ] 都是判断参数是否未定义
设置默认值
下面都是判断变量是否为空,为空后赋值
if [ -z “$VAR” ]
then
VAR=“AAA”
fi
[ -z “$VAR” ] && VAR=“AAA”
[ ! “$VAR” ] && VAR=“AAA”
[ “$VAR” ] || VAR=“AAA”
-
变量替换
- ${var:=“A”} ${var1:=1} KaTeX parse error: Expected '}', got 'EOF' at end of input: {var2:=LANG}
第一个冒号表示执行非活动的shell命令
第二 := 表示 变量和值比较 如果变量没有被设置过或变量没有值 则 会赋值 被设置后不会被赋值
第一个冒号后面 可以跟多个 变量
文件编码转换
iconv -f gb2312 -t utf-8 aaa.txt >bbb.txt
file 文件名称 查看文件编码格式
普通重定向
< file file 文件的内容作为输入
<< EOF
EOF 双输入重定向符 接着是一个唯一的定界符号 文本最后一行 是与之匹配的结束定界符。
> file file文件的内容为输出 文件不存在则会创建 文件 存在则会覆盖
>>file file文件的内容未输出 输出的内容会追加到file文件的末尾
表达式 2>/dev/null >file 将错误输出定向到/dev/null 标准输出定向到 file中
表达式 >/dev/null 2>file 将标准输出定向到/dev/null 错误输出定向到file中 和上一句相反
表达式 >file 2>&1 表达上标准输出和错误输出都被定向到制定文件file中
表达式 &>file 上一句的简写版
表达式 2>file 将表达式的标准错误输出定到制定文件
shell 中的计算
expr 用于计算各种表达式的值 可以包含字符串 逻辑运算和数学函数
加: answer=`expr $a + $b`
减: answer=`expr $a - $b`
乘: answer=`expr $a * $b`
除: answer=`expr $a / $b`
同余: answer=`expr $a % $b`
shell自身可以执行数学运算,减少代码占用的内存资源(好像智能是整数)
加:answer=$(($a+$b))
减:answer=$(($a-$b))
乘:answer=$(($a*$b))
除:answer=$(($a/$b))
同余:answer=$(($a%$b))
指数:answer=$(($a**$b))
多个计算顺序:answer=$((($a+$b)*$c))
bc计算 可以计算小数
如: answer=`echo “
a
+
a+
a+b”|bc`
answer=`echo “scale=5;
a
/
a/
a/b”|bc-l` (scale 小数的精度 )
vi编辑器
复制:将光标移到复制的首位置,按下v,用hjkl (前后上下)移动,按y复制,按p粘贴
冒号表示命令模式
i 是插入模式
yy 复制当前行 p是粘贴
dd 删除当前行
:wq 保存退出
:set number 显示行号
awk几个用法
echo $LANG | awk -F’’ ‘{print $1,$0,NF}’
awk 域变量从$1 开始 递增 -F 表示分隔符号 $0比较特殊 保存着整个字符串 NF 表示列数
echo $LANG | awk -F’’ ‘{print $(NF-1)}’ 倒数第二列
length 表示字符串长度
substr($1,开始,结束)
awk -F’|’ ‘$2 == “AAA” {print $0}’ /etc/hosts
使用 | 作为分隔符号 第二例等于AAA 的行
awk -F’|’ ‘/AAA/ {print $0}’ /etc/hosts
使用 | 作为分隔符号 行包含AAA 的行
awk -F’|’ ‘$1 ~ /AAA/ {print $0}’ /etc/hosts
使用 | 作为分隔符号 第一列包含AAA 的行 ~后面可以是正则表达式
awk ‘{if (length !=0}’ print $0} 输出非空行
sed常用
echo $VAR| sed -e “s/搜索字符串/替换字符串/g” # g表示全局 没有的话仅仅替换找到的第一个项
单引号 和 双引号
在双引号中使用$可以是变量 当引号中是字符