shell脚本学习心得

近来主要捣鼓ubuntu,大多数项目中都用到了sh脚本作为启动脚本等,以前只是大概明白如何使用,今天需要自己修改并运行脚本就碰到了很多问题,所以决定静下心来学习一下shell脚本,学习了几个小时,现将一些要点总结如下,以供以后翻看或者供入门人员参考。

  • 第一行

这里指的是脚本第一行,一般脚本第一行都是

#!/usr/bin/env bash

这句话的意思是告诉操作系统用哪个命令来解析脚本,一般不用改变

  • 脚本(函数)参数
运行xx.sh 1 2 3后
$*为"1 2 3"(一起被引号包住)
$@为"1" "2" "3"(分别被包住)
$#为3(参数数量)

注:如果以上字符出现在函数里就是函数的输入

  • 控制语句
    • if

“if” 表达式如果条件为真则执行then后面的部分:

if ….; then

….

elif ….; then

….

Else

….

fi

大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…

通常用” [ ] “来表示条件测试。注意这里的空格很重要。要确保方括号的空格。

[ -f "somefile" ] :判断是否是一个文件

[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限

[ -n "$var" ] :判断$var变量是否有值

[ "$a" = "$b" ] :判断$a和$b是否相等

[ -d "$f" ] 判断f这个变量的值是否是个文件夹

  • for循环
for TIF in $(ls $LAYERS)
do
  INPUT=file:$($LAYERS/$TIF)
    echo $INPUT
done

ls $LAYERS表示列出文件夹下所有文件,所以这是个集合,for循环遍历集合里所有文件,TIF为循环变量

  • 操作符
    • &&

&&意思是如果左边成立执行右边相当于 与

如:dir=$(cd "$dir" && /bin/pwd);

这句话的意思是如果cd dir变量的值没有错误即dir变量所代表的文件夹路径正确,则执行/bin/pwd,即输出全路径 

[ -f "/etc/shadow" ] && echo “This computer uses shadow passwors”  [  ]里面表示一种判断

  • 变量定义
LAYERNAME="SRTM"

无需申明但是=前后不能有空格,使用的时候$LAYERNAME 或者 ${LAYERNAME}

  • 函数
    •  定义函数
realpath ()
{
    f=$@;
    echo "$f"
    if [ -d "$f" ]; then
        base="";
        dir="$f";
    else
        base="/$(basename "$f")";
        dir=$(dirname "$f");
    fi;
    dir=$(cd "$dir" && /bin/pwd);
    echo "$dir$base"
}

函数中的echo表示返回值,如果有多个echo最终输出会拼接起来。函数中的$@等表示函数的参数

    • 使用函数

只需使用 realpath $LAYERS即可,$LAYERS为变量,realpath后面可以跟任意数量的参数以空格隔开,这些参数可以被realpath中的$@全部接受。其实echo就是个函数 以上就是我所学到的shell脚本编写语法,不足之处还请大家补充。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏自动化测试实战

flask第二十四篇——模板【6】自定义过滤器

2546
来自专栏机器学习从入门到成神

2015百度校招笔试真题以及解析(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

2062
来自专栏野路子程序员

Thinkphp修改一句代码,使得foreach标签支持对象,增加变量[数组对象]混合解析法!

3268
来自专栏前端侠2.0

co yield避免嵌套详细代码示例。

1621
来自专栏Python小屋

Python处理文本文件案例一则

问题描述:当前文件夹中有一文件data.txt,其中包含一些自然数,每行一个。要求编写程序,读取data.txt中的所有自然数,将其升序排序之后写入新文件dat...

1343
来自专栏Java 源码分析

Java多线程

1.复写run方法的目的在于,把要运行的代码放到run方法里面,也就是新的线程要跑什么内容 这也就是第一种多线程的方法,其主要的步骤如下: 继承Thread类 ...

3064
来自专栏小二的折腾日记

day5(面向对象2)

用来将文件或文件夹封装成对象。 方便对文件与文件夹的属性信息进行操作。 File对象可以作为参数传递给

661
来自专栏懒人开发

AndroidStudio简单使用(二):左侧Structure

上面有说, 可以通过 Alt + 7 快捷键 调出来。 个人觉得, 这个对于查看代码结构,还是很方便的。直接可以看到代码的大体结构。 我们以 android...

3212
来自专栏chenssy

一题带你彻底理解 sleep() 和 wait()

这段话令人感到迷惑,一个对象不是只有一个锁吗?只有获得这个对象的锁才能对它进行操作,若这个对象的锁被一个线程先获得,那就其他线程就需要等待。那多次加锁什么意思,...

1691
来自专栏FreeBuf

Safari信息泄露漏洞分析

Javascript中的数组和数组对象一直都是编程人员优化的主要目标,一般来说,数组只会包含一些基本类型数据,比如说32位整数或字符等等。因此,每个引擎都会对这...

952

扫码关注云+社区

领取腾讯云代金券