#! /bin/bash # 声明使用哪种shell,这里是bash
log='haha' # 定义变量,shell的变量是弱类型的字符串
echo $log # 使用变量
echo $2 # 执行该程序时传入的第二个参数
echo $# # 执行该程序时传入参数的个数
echo $? # 上一条命令的返回状态,0 表示执行正确
echo $$ # 当前进程ID
for attr in $@ # $@为执行该程序时传入的参数列表
do
########### 单个值 ###########
echo `date` # 只有一个命令
echo $(date) # 只有一个命令,一般用这个
echo date # 只有一个单词
echo $attr # 只有一个变量
echo $[2#11+2] # 只有一个表达式求值,2#11表示2进制数11,即3
########### 多个值 ###########
# 不使用引号整体括起来
echo $attr `date` $(date) "date" date $[1+2]
# 双引号括起来,单引号称为普通字符
echo "$attr `date` $(date) 'date' date $[1+2]"
# 单引号括起来,所有字符都成为普通字符
echo '$attr `date` $(date) "date" date $[1+2]'
########### 最佳用法 ###########
echo 'date' # 只有一个单词,用单括号,更好区分
echo 'date $attr' # 多个单词,用单括号,形成整体
echo "date $attr" # 多个值,用双括号,形成整体
done
read passwd # 等待输入
if [ $passwd = '123'] # 相当于if test $passwd = 123,表达式为真,则test返回状态$?为0
then
echo 'correct'
else
echo 'wrong'
fi
while [ !$passwd -eq '123' ] # 循环
do
$passwd=$passwd+1
done
trap 'echo 11' INT # 接到INT信号时 执行echo 11
function printit(){ # 函数定义
echo ${1} # 调用函数时,传入的第一个参数
}
printit 1 # 函数调用,并传入参数
export x=1 # 把局部变量 导出为 环境变量
case $cho in
"yes")
echo "yes"
;;
"*")
echo "*"
;;
esac
exit 1 # 退出,并返回一个状态
变量
查看所有变量:set
查看环境变量:env,printenv
查看语系:locale
注销变量:unset log
常用环境变量:USER,HOSTNAME,LANG,SHELL,PATH,PS1(命令提示符格式,即光标前面的串)
追加PATH:PATH="$PATH":/目录
信号处理
1、发出信号
四个等价命令:kill -s SIGTERM pid、kill -n 15 pid、kill -15 pid、kill -TREM pid
2、信号捕获
trap "echo 11;exit 2" INT # 处理并退出,INT 也可以替换为它的编号 2
trap "" INT # 忽略
trap INT # 恢复默认处理
3、信号类型
查看信号列表:kill -l
HUP(1) 挂起,终端掉线或退出,前台进程将收到信号,默认终止进程
INT(2) 中断,Ctrl+C,前台进程将收到信号,默认终止进程
QUIT(3) 退出,Ctrl+\,前台进程将收到信号,默认CoreDump
KILL(9) 杀死,不能被捕获
STOP(19) 停止,不能被捕获
STP(20) 暂停,CTRL+Z,前台进程将收到信号,默认暂停进程
4、默认行为
CoreDump(核心转储):当程序运行过程中异常退出时,内核把当前程序在内存状况存储在一个core文件中,以便调试
暂停进程:查看暂停的进程 jobs,恢复暂停的进程 bg job号
子shell
进入子shell:bash,父shell的局部变量失效,环境变量仍然有效
退出当前shell:exit,即回到父shell
查看进程树,shell层次:pstree
条件判断
存在判断 [-e /root],文件存在判断[-f /etc/file],目录存在判断[-d /root]
存在权限判断 [-r /etc] [-w /etc] [-x /etc]
数值判断:等于-eq 或 =,不等于-ne 或 !=,大于-gt,大于等于-ge,小于-lt,小于等于-le
字符串判断:为空[-z str],非空[-nstr],相同[str1 ==str2]
多重判断:与-a,或-o,非!
条件执行&&:命令1&&命令2,命令1执行正确,则执行命令2
条件执行||:命令1 || 命令2,命令1执行不正确,则执行命令2
循环
for循环:for i in 1 2 3 4 5,for in {cat ls.log},for((i=1;i<=num;i=i+1))
重定向
无底洞:/dev/null
重定向标准输出:命令 >/dev/null 或 命令 1>/dev/null,1是标准输出的文件描述符
重定向(追加)标准输出:命令 >>/dev/null 或 命令 1>>/dev/null
重定向标准错误:命令 2>/dev/null,命令 2>>/dev/null,2是标准错误的文件描述符
12重定向连写:命令 &>/dev/null 或 命令 >/dev/null 2>&1
12重定向(追加)连写:命令 &>>/dev/null 或 命令 >>/dev/null 2>&1
2>&1:表示2的重定向目标和方式(覆盖还是追加)与1相同,也可以写成2&>1
网友评论