当前位置: 首页 > news >正文

linux Shell编程

0. man bash可以看到很多很多

1. 变量与变量值(展开)

    如果你需要的是变量名,直接使用变量名;如果你需要的是变量值,使用$符号。例如:

    export PATH=/home/bin:\$PATH

    如果你不确定是要变量还是展开的变量值,那么试着展开下代入表达式看看对不对头。

    一般来说,需要左值的地方(给变量赋值)直接用变量名;需要右值的地方(取变量的值)加$符号。

2. 变量赋值,等于号前后不要加空格(加空格的形式用于变量比较)。

3  隔开变量和后缀:

    \${go}ing

    注意不要{\$go}ing

4. shell通配符和引号

4.1 没有引号

      例如ls *.*,shell会将*.*展开为当前目录下所有文件,然后传递给 ls。

4.2 双引号

      如果你用ls "*.*",shell会将*.*原样传递给ls,ls就会告诉你没有哪个文件的文件名是*.*

      但是,如果双引号内存在\$符号,shell还是会解释。

4.3 单引号

      好了,现在连\$也不解释了。

5. C风格表达式

    #!/bin/bash

    var=2                        # 默认变量类型是string,不能直接进行数学运算

    echo \$((var * var))    # ((C  stype expression)),放在两个小括号内,可以在运算符前后加空格,取变量var的值不需要\$,计算得到的新(临时?)变量仍然用\$引用交给echo

    echo \$var                 # var的值还是2,没有改变。如果上一行是\$((var++)),那这一行就是3了。

6. if条件语句

    在shell中,if、[、]等都是内置命令,所以if和[之间以及[]和条件之间都需要用空格分开,避免解释器将if[解释为一条命令。同样的理由,if语句和then语句要分两行或以分号隔开,避免解释器将then认作是if的参数(虽然then不是内置命令)。 

if [ -f testfile ]
then
    # do something
fi
#或者这样写
if [ -f testfile ]; then
    #do something
fi

    上面程序可简写为:

     [ -f testfile ] && do_something

    ||符号也是也可以这么用的:

     [ -f testfile ] || { echo "oops!"; exit 1; }

     同样需注意空格问题:[]和||和{}之间;{}内侧;分号后面。原因都是为了告知bash,命令或参数已结束。注意大括号内部的命令,每条后面都要加分号。

     更多结束:[]内部语句相当于一个测试表达式,有返回值。因此你可以用if判断这个返回值,也可以让bash判断这个返回值。

 6.1 字符串比较

# "=="符号前后加空格
# 两个字符串都用引号包围
# 否则当$str未定义时会发生问题

if
[ "$str" == "string" ]; then # do something fi

字符串比较时,两个字符串都用引号包围。script在执行前,变量会被替换为其真正的值,因此,若变量不存在,那么不加引号的if [ \$str == “what” ]会在执行前被替换为if [ == "what"]。

使用-z "string" (string is Empty)或-n (string is Not empty)时同样需加引号,否则[ -z \$a ]就可能会被替换为[ -z ]。而根据bash规则,无参数测试总是为true(?)。因此,若\$a为空,那么[ -z \$a ]和[ -n \$a ]测试将同时成立。

既然可以使用==,那么在需要时也可以使用!=、>、<。注意>和<都是shell特殊字符,因此需要加转义:

[ "a" \< "b" ] && echo "char a is less then char b"

6.2 数值比较

数值比较使用-eq、-ne、-gt、-lt、-ge、-le。

7. 其他测试选项

    使用help test可以查看所有可用测试选型。

8. 在当前shell环境中执行script

    source your_script

    或者

    . your_script

    以上,your_script不需要x权限。
9. 引用命令执行结果

    两种形式:

    echo \$(find . -name "*.c")

    echo `find . -name *.c`

10. cp file file.orig

     可以用如下形式:

     cp \$file{,.orig}

     \$var{.a,.b,.c,.d}将被展开为

     \${var}.a \${var}.b \${var}.c \${var}.d

     逗号前后不能有空格。

相关文章:

  • Vue--数据传输
  • CentOS 6.4 yum快速搭建Zabbix 2.2版本(中文)
  • python excel 转 csv
  • Android自定义控件实现简单的轮播图控件
  • 2016.04.22-2016.04.28这周工作时间和内容
  • Python 主要模块和常用方法简览
  • IBM在云计算中推动了Swift并使用了Swift的运行环境、包目录和其更多属性
  • ToughRADIUS 安装配置指导(视频教程)
  • ZeroMQ(java)之I/O线程的实现与组件间的通信
  • mysql 5.7.12----bin/mysqld --initialize --user=mysql出错
  • javascript获取当前的时间戳
  • java使用Executor(执行器)管理线程
  • WEB和APP谁是互联网未来
  • jvm GC日志解读
  • GCC中-fpic解惑(转载)
  • $translatePartialLoader加载失败及解决方式
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JAVA 学习IO流
  • js写一个简单的选项卡
  • Laravel 菜鸟晋级之路
  • Less 日常用法
  • mac修复ab及siege安装
  • Redis在Web项目中的应用与实践
  • RxJS: 简单入门
  • scrapy学习之路4(itemloder的使用)
  • vue脚手架vue-cli
  • XML已死 ?
  • 阿里研究院入选中国企业智库系统影响力榜
  • 服务器之间,相同帐号,实现免密钥登录
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 通过git安装npm私有模块
  • 线性表及其算法(java实现)
  • 自制字幕遮挡器
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ###C语言程序设计-----C语言学习(3)#
  • #etcd#安装时出错
  • #Java第九次作业--输入输出流和文件操作
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)fread与fwrite详解
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (理论篇)httpmoudle和httphandler一览
  • (四)c52学习之旅-流水LED灯
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)LINQ之路
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET DataGridView数据绑定说明
  • .net framework profiles /.net framework 配置
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇