shell scripts

时间:2022-05-05 01:06:06

本文涉及的命令:test、[]、shift、if、case、for、while、until、function、sh。

  1. 撰写 shell script 的良好习惯
  •   在每个 script 的文件头处记录好:
  •     script 的功能;
  •     script 的版本信息;
  •     script 的作者与联绚方式;
  •     script 的版权宣告方式;
  •     script 的 History (历叱纪录);
  •     script 内较特殊的指令,使用『绛对路径』的方式来下达;
  •     script 运作时需要的环境变量预先宣告与设定
  • 变量替换(赋值)
    1. $variable    保存在variable中的值
    2. ${variable}    保存在variable中的值
    3. ${variable:-string}  如果variable的值非空,则值为variable,否则值为string
    4. ${variable:+string}  如果variable的值非空,则值为string,否则值为空
    5. ${variable:=string}  如果variable的值非空,则值为variable,否则值为string且variable的值设置为string
    6. ${variable:?string}  如果variable的值非空,则值为variable,否则显示string并退出
    7. ${变量名}字符-----------------使用大括号,给变量后面加一些特定的字符
  • "basename $0" 显示程序名,去掉目录信息
  • 变量在引用时不带引号,则空格和换行符会被删除,带引号则会保留。
  • test------------------测试
    1. 关于某个档名的『文件类型』判断,如 test -e filename 表示存在否
      • -e 该『档名』是否存在?(常用)
      • -f 该『档名』是否存在且为档案(file)?(常用)
      • -d 该『文件名』是否存在且为目录(directory)?(常用)
      • -b 该『档名』是否存在且为一个 block device 装置?
      • -c 该『档名』是否存在且为一个 character device 装置?
      • -S 该『档名』是否存在且为一个 Socket 档案?
      • -p 该『档名』是否存在且为一个 FIFO (pipe) 档案?
      • -L 该『档名』是否存在且为一个连结档?
    2. 关于档案的权限侦测,如 test -r filename 表示可读否 (但 root 权限常有例外)
      • -r 侦测该档名是否存在且具有『可读』的权限?
      • -w 侦测该档名是否存在且具有『可写』的权限?
      • -x 侦测该档名是否存在且具有『可执行』的权限?
      • -u 侦测该文件名是否存在且具有『SUID』的属性?
      • g 侦测该文件名是否存在且具有『SGID』的属性?
      • -k 侦测该文件名是否存在且具有『Sticky bit』的属性?
      • -s 侦测该档名是否存在且为『非空白档案』?
    3. 两个档案之间的比较,如: test file1 -nt file2
      • -nt (newer than)判断 file1 是否比 file2 新 
      • -ot (older than)判断 file1 是否比 file2 旧
      • ef 判断 file1 与 file2 是否为同一档案,可用在判断 hard link 的判定上。主要意义在判定,两个档案是否均指向同一个 inode。
    4. 关于两个整数之间的判定,例如 test n1 -eq n2
      • -eq 两数值相等 (equal)
      • -ne 两数值不等 (not equal)
      • -gt n1 大于 n2 (greater than)
      • -lt n1 小于 n2 (less than)
      • -ge n1 大于等于 n2 (greater than or equal)
      • -le n1 小于等于 n2 (less than or equal)
    5. 判定字符串的数据
      • test -z string   判定字符串是否为 0 ?若 string 为空字符串,则为 true
      • test -n string   判定字符串是否非为 0 ?若 string 为空字符串,则为 false。注: -n 亦可省略
      • test str1 = str2  判定 str1 是否等于 str2 ,若相等,则回传 true。
      • test str1 != str2  判定 str1 是否不等于 str2 ,若相等,则回传 false
    6. 多重条件判定,例如: test -r filename -a -x filename
      • -a  (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有r 与 x 权限时,才回传 true。
      • -o  (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有r 或 x 权限时,就可回传 true。
      • !  反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true
  • []------------和test的功能相同
    • 1.在中括号 [] 内的每个组件都需要有空格键来分隔;
    • 2.在中括号内的变数,最好都以双引号括号起来;
    • 3.在中括号内的常数,最好都以单或双引号括号起来。
  • script 的执行方式差异 (source, sh script, ./script)
    • 1.利用直接执行的方式来执行 script,是子程序运行 (子程序中的变量无法在父程序中运行)
    • 利用 source 来执行脚本:在父程序中执行。例:source sh02.sh
  • Shell script 的默认变数($0, $1...)
    • /path/to/scriptname opt1 opt2 opt3 opt4
      • $0                  $1   $2     $3    $4
    • $# :代表后接的参数『个数』,以上表为例这里显示为『 4 』;
    • $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
    • $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隑字符,默认为空格键, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
  • shift:造成参数变量号码偏移
    • shift 会移动变量,而且 shift 后面可以接数字,代表拿掉最前面的几个参数的意思。
    • 例: echo "Total parameter number is ==> $#"
      • echo "Your whole parameter is ==> '$@'"
      • shift # 进行第一次『一个变量的 shift 』
      • echo "Total parameter number is ==> $#" -----这次显示的会比上次少一个
      • echo "Your whole parameter is ==> '$@'" -----这次显示会比上次的少最左边那个参数
      • shift 3 # 进行第二次『三个变量的 shift 』
      • echo "Total parameter number is ==> $#"
      • echo "Your whole parameter is ==> '$@'"
  • 条件判断式-----------------------------if中的运算符必须在两个[]之间。
    1. 单层、简单条件判断式
      • if .... then
        • if [ 条件判断式 ];
          • then 当条件判断式成立时,可以进行的指令工作内容;
        • fi <==将 if 反过来写,就成为 fi 啦!结束 if 之意!
        • && 代表 AND ;
        • || 代表 or ;
        • 例: read -p "Please input (Y/N): " yn
          • if [ "$yn" == "Y" ] || [ "$yn" == "y" ];
            • then echo "OK, continue"
            • exit 0
          • fi
          • if [ "$yn" == "N" ] || [ "$yn" == "n" ];
            • then echo "Oh, interrupt!"
            • exit 0
          • fi
          • echo "I don't know what your choice is" && exit 0
    2. 多重、复杂条件判断式
      1. 一个条件判断
        • if [ 条件判断式 ];
          • then 当条件判断式成立时,可以进行的指令工作内容;
          • else 当条件判断式不成立时,可以进行的指令工作内容;
        • fi
      2. 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行
        • if [ 条件判断式一 ];
          • then 当条件判断式一成立时,可以进行的指令工作内容;
        • elif [ 条件判断式二 ];
          • then 当条件判断式二成立时,可以进行的指令工作内容;
        • else
          • 当条件判断式一与二均不成立时,可以进行的指令工作内容;
        • fi
    3. case ... in .... esac-----------------(实际案例)
      • case $变量名称 in <==关键词为 case ,还有变数前有钱字号
        • "第一个变量内容") <==每个变量内容建议用双引号括起来,关键词则为小括号 )
          • 程序段
          • ;; <==每个类删结尾使用两个连续的分号来处理!
        • "第二个变量内容")
          • 程序段
          • ;;
        • *) <==最后一个变量内容都会用 * 来代表所有其他值
          • 不包含第一个变量内容与第二个变量内容的其他程序执行段
          • exit 1
          • ;;
      • esac <==最终的 case 结尾!
    4. function 功能------------函数
      • function fname()    --------fname为自定义名称
        • {
          • 程序段 ------程序内也可以使用变量($1...),在调用时直接函数名加变量数字
        • }
    5. while do done, until do done (不定循环)
      • while [ condition ] <==中括号内的状态就是判断式
        • do <==do 是循环的开始!
          • 程序段落
        • done <==done 是循环的结束
      • until [ condition ]
        • do
          • 程序段落
        • done
    6. for...do...done (固定循环)  ---------------已知要循环几次
      • for var in con1 con2 con3 ...
        • do
          • 程序段
        • done
    7. for (( 初始值; 限制值; 执行步阶 )) -------------数值的处理
      • do
        • 程序段
      • done
  • shell script 的追踪与 debug
    • sh [-nvx] scripts.sh
      • -n :不要执行 script,仅查询语法的问题;
      • -v :再执行 sccript 前,先将 scripts 的内容输出刡屏幕上;
      • -x :将使用刡的 script 内容显示刡屏幕上,这是很有用的参数!
  • ============================================================================

    () 和 {}的区别
    这两个都是对一串命令的执行,但有些区别
    1.()只是对一串命令重新开一个子进程进行执行
     {}是在当前进程执行
    2.()和{}内的命令都是以;隔开
     ()最后一个命令可以不用分号;
     {}最后一个分号需要
    3.()第一个命令不需要和括号间有空格
     {}第一个命令和左边的括号间有空格
     
    对于1:
    $ var=10
    $ (var=20;echo $var)
    20
    $ echo $var
    10
    说明()中执行的语句没有调用当前的变量,所以是在子进程中实现
     
     
    $ var=30
    $ { var=40;echo $var } #第一个要有空格哦
    40
    $ echo $var
    40
    说明var被修改了,是在同一个进程中实现
    --------------------------------------------------------------------------------------------------------------------
    2.POSIX标准的扩展计算:$((exp))
    这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$((exp)),甚至是三目运算符。
    注意:这种扩展计算是整数型的计算,不支持浮点型.若是逻辑判断,表达式exp为真则为1,假则为0。
    $ echo $((3+2))
    5
    $ echo $((3>2))
    1
    $ echo $((25<3 ? 2:3))
    3
    $ echo $var
    $ echo $((var=2+3))
    5
    $ echo $var
    5
    $ echo $((var++))
    5
    $ echo $var
    6
    -----------------------------------------------------------------------------------------------------------------------

    shell scripts的更多相关文章

    1. 第十三章、学习 Shell Scripts

      什么是 Shell scripts shell script (程序化脚本) :shell script 是针对 shell 所写的『脚本!』 shell script 是利用 shell 的功能所写 ...

    2. React native采坑路 Running 1 of 1 custom shell scripts

      1. Running 1 of 1 custom shell scripts 卡住的问题. 分析: 四个文件没有下载完成. boost_1_63_0.tar.gz folly-2016.09.26.0 ...

    3. 鸟哥的 Linux 私房菜Shell Scripts篇(一)

      参考: http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#script_be http://www.runoob.com/lin ...

    4. 鸟哥的Linux私房菜——第十六章:学习Shell Scripts

      视频链接:http://www.bilibili.com/video/av10565321/ 1. 什么是 Shell Script       (shell写的脚本)1.1 干嘛学习 shell s ...

    5. 鸟哥的Linux私房菜-第10&sol;11&sol;12&sol;13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)

      第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...

    6. linux source命令与sh shell scripts的区别

      source FileName 作用:在当前bash环境下读取并执行FileName中的命令. 注:该命令通常用命令“.”来替代. 如:source .bash_rc 与 . .bash_rc 是等效 ...

    7. Expect Command And How To Automate Shell Scripts Like Magic

      In the previous post, we talked about writing practical shell scripts and we saw how it is easy to w ...

    8. 鸟哥的linux私房菜——第十二章学习(Shell Scripts)

      第十二章  Shell Scripts 1.0).什么是shell scripts? script 是"脚本.剧本"的意思.整句话是说, shell script 是针对 shel ...

    9. 第十三章、学习 Shell Scripts 条件判断式

      利用 if .... then 单层.简单条件判断式 if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的命令工作内容: fi <==将 if 反过来写,就成为 fi !结束 i ...

    随机推荐

    1. 使用Scala实现Java项目的单词计数:串行及Actor版本

      其实我想找一门“具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性”的编程语言. Scala 就是一个不错的选择. Scala 有很多语言特性, 建议先掌握基础常用的: ...

    2. linux命令:more

      1.命令介绍: more用来逐页输出文件内容,空格键进入到下一页,b键返回到上一页. 2.命令格式: more [选项] 文件 3.命令参数 +n      从笫n行开始显示 -n       定义屏 ...

    3. CSS3:不可思议的border属性&amp&semi;Web字体图标Font Awesome

       CSS3:不可思议的border属性 转载至——译文:不可思议的CSS border属性 原文:Magic of CSS border property Web字体图标Font Awesome 转载 ...

    4. 【转】从零开始编写自己的C&num;框架(7)——需求分析

      转自:http://www.cnblogs.com/EmptyFS/p/3653934.html 本章内容虽然叫“需求分析”,实际上关于具体的需求分析操作步骤并没有深入去写,因为细化的话那将是一本厚厚 ...

    5. 03&lowbar;MySQL中文乱码处理&lowbar;01&lowbar;MySQl数据库字符集知识

      [MySql数据库常见字符集介绍] 在互联网环境中,使用MySql时常用的字符集有: [如何选择合适的字符集] 1.如果处理各种各样的文字,发布到不同语言的国家地区,应选Unicode字符集,对MyS ...

    6. html5 API

      1.Canvas绘图 2.postMessage跨域.多窗口传输 3.requestAnimationFrame动画 4.PageVisibility API页面可见性 5.File 本地文件操作 6 ...

    7. ORA-02266&colon; 表中的唯一&sol;主键被启用的外键引用

      http://www.cnblogs.com/cici-new/archive/2013/01/01/2841700.html 需要如下操作 先取消子表外键的外键约束,之后删除父表数据,最后再次启用外 ...

    8. git图形化界面gitk里中文乱码解决

      将git全局配置成utf-8格式即可,命令行里输入 git config --global gui.encoding utf-8

    9. 新装 Win7 系统装完驱动精灵,一打开到检测界面就卡死——原因与解决方案

      1.现象: 重装系统后,鼠标反应慢,且不能上网.因此装了个驱动精灵,准备更新下驱动,但驱动精灵一打开到检测界面就卡死(换驱动人生.鲁大师也一样). 2.原因: Win7 系统 iso 中自带的驱动程序 ...

    10. Hive中的Row&lowbar;Number&lpar;&rpar;使用

      语法:row_number() over (partition by 字段a order by 计算项b desc ) rank --这里rank是别名 partition by:类似hive的建表, ...