Shell编程

#! /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  # 退出,并返回一个状态

能echo 的值,都可以赋给变量

变量

查看所有变量: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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 9,947评论 0 5
  • 流程控制 if 单条件 双分支 多分支 case case支持glob风格的通配符: *: 任意长度任意字符?: ...
    毛利卷卷发阅读 4,114评论 0 1
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,131评论 0 10
  • 1.source命令 2.配置文件 ![](/Users/mac/Library/Containers/com.t...
    Chinesszz阅读 3,138评论 0 0
  • 偶然在网易上听到这首歌,本来在提笔练字的我,突然想写点什么东西,许是歌词太有感触吧,说出来都感觉自己有点沧桑的感觉...
    沫宝贝wy阅读 3,856评论 0 0