1. 按行读取文件
#!/bin/bash
exec < a.txt
while read line
do
echo $line
done
2. shell日期
u=`date "+%Y-%m-%d %H:%M:%S"`
echo $u
echo $u >> d.logkkkk
3. 分号, 多行命令分割符号如:
echo "begin bak..." ; cp $filename $filename.bak
if [ $var -eq 0 ]; then
双分号;;可以作为case的终止结束符号
4. 双引号, 单引号, 逗号, 点
" 字符串中大部分字符会阻止(不解析, 作为普通字符串)
' 字符串所有的字符会阻止(echo '$var' 将输出$var )
, 逗号, 链接算术运算但只返回最后一项 如 let "a = ((b=3, 5*10))" # a=50, b=3
5. 转意\ \x 等价 "x" 也等价于 'X'
6. 冒号: 空命令, 该命令返回true(0) 如
检测变量是否设置
: "${username?}“ # username: parameter null or not set 没有被设置的情况
while :
do
sleep 1
done
if 成立啥不做a=0
if [ $a -eq 1 ];
then :
else
echo "eq"
fi
清空某个文件
: > data.log
7. $
$var 变量引用
${} 参数替换
$? 命令执行退出状态码,0 为正常
$$ 进程ID变量
$*, $@ 所有的位置参数
$# 变量个数
正则表达式结束符
8. () 命令组,如(a=shit; echo $a), 命令组作为子shell运行, 所以父进程不能使用子进程的变量
prog_dir=$(cd $(dirname $0)/..; pwd) # 切换到脚本目录,这样能避免很多路径问题
10. (()) 整数扩展
11. IFS 内部分割符号
#!/bin/bash
var="(\\]\$"
echo $var # (\]$*
echo "$var" # (\]$*
echo '$var'
IFS='\\'
echo $var # ( ]$*
echo "$var" # (\]$*
12. 转意符 \
#!/bin/bash
echo "\v\v" # \v\v
echo -e "\v\v" # 垂直制表符号
13. 返回码 exit
脚本调用结束, 都会有一个返回值, 0表示成功,非0表示不成功, 返回值必须在0-255, 必须是整数. 不写的话等价 exit $?
14 if 测试命令返回, 也就是if command , command并非一定是[ ], [[ ]]. 同时[[ ]] 不一定非与if不可 如: [ 1 -ne 2 ] && echo "1 not eq 2"
# 非常有用的if-grep 结构
# if 测试命令返回值是不是true(0)
if echo "aa" | grep -q test.txt
then
echo "aa contain"
else
echo "aa not contain"
fi
if的嵌套
a=1
b=2
if $a
if [[ $a < $b ]]
then echo "a<b"
else
echo "x"
fi
then
echo "y"
fi
14. (( )) 算术扩展表达式, 如果表达式的结果未0则命令返回非0, 就是假。与命令退出码恰好相反, 参考13点
#!/bin/bash
if (( 0 )) # false
then
echo "true"
else
echo "false"
fi
15. 常用的测试符号
-n(-z) 测试变量是否存在(未定义或者是NULL)
-e 文件是否存在
-f 是否是否文件
f1 -nt f2 文件f1比文件f2新(-ot 比较旧)
字符串比较的时候,为了安全, 可以添加一个字符 如: [[ "x$a" == "x$b" ]]
例子:
#!/bin/bash
# cat file
NOARGS=65
NOTFOUDN=66
NOTGZIP=67
if [ $# -eq 0 ]
then
echo "Usage: basename $0 filename"
exit $NOARGS
fi
filename=$1
if [ ! -f $filename ]
then
echo "$1 not found"
exit $NOTFOUND
fi
if [ "${filename##*.}" != "txt" ] ## 变量替换 value##pattern 替换掉##前面的返回匹配的
then
echo "$filename is not txt file"
fi
cat $filename | more
exit $?
字符串查找,匹配,子串 ,正则处理bash都可以很好的处理
#!/bin/bash
# length
str="abcd"
echo ${#str} # 4
echo `expr length $str` # 4
# match length
str="12abcd23#?32"
echo `expr match "$str" 12[a-z]*.23` # 8
# index
echo `expr index "$str" cd` # 5
# substring
echo `expr "${str:3}"` # bcd23#?23
echo `expr "${str:3:2}"` # bc