Linux Shell 脚本编程之前一直没有系统的去学习,在写 Shell 脚本的时候总需要现查各种语法。本文章以编程语言的维度去系统的学习 Shell 脚本编程。

Shell

Linux Shell 是与 Linux 系统交互的一个应用程序,我们通过这个程序可以操作 Linux 系统的内核服务。

执行 $cat /etc/shells, 可以看到系统中现在可用的 Shell 解释器

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells./bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh
复制代码

现代的 Linux 系统中 /bin/sh 已经被 /bin/bash, 作为 Linux 默认的 Shell.

输入 $echo $SHELL 可以看到当前系统的 Shell.

Shell 脚本

Shell 脚本 (Shell Script), 是为 Shell 编写的一个脚本程序。我们说的 Shell 通常指的是 Shell 脚本。

Shell 变量

Shell 脚本属于弱类型的脚本语言,在使用的时候不需要提前定义变量类型。

可能的坑:

  1. 赋值变量不能有美元符号 ($)
  2. 赋值语句等号 (=) 左右都不能有空格

变量定义

#!/bin/bash

# 直接赋值
name="cizel"# 语句赋值
for file in `ls /etc`
复制代码

变量使用

#!/bin/bash

# 定义变量 name
name="cizel"# 使用美元 ($) 符号
echo $name# 使用美元 ($) 符号和括号结合,常用于字符串拼接
echo ${name}
复制代码

or

#!/bin/bash

# 高级用法# 默认值:如果变量没有声明,使用默认值 ${var=DEFAULT}
echo ${name="ok"}
# output: ok# 默认值:如果变量没有声明,或者为空字符串,使用默认值 ${var:=DEFAULT}
name=""
echo ${name:="ok"}
# output: ok
复制代码

Shell 数字运算

Shell 中的数字运算可以采用 $((num1 + num2)) 的方式,例如:

可能的坑:

  1. Shell 中的变量默认是字符串,使用 result=1+2;echo $result , 输出会是 1+2
  2. 数值运算的两个变量必须是 数字 或者 数字字符串, 不然会报错
#!/bin/bash

a=2
b="3"echo (($a + $b))
# output: 5echo (($a - $b))
# output: -1echo (($a * $b))
# output: 6echo (($a / $b))
# output: 0# 取模 / 求余
echo $(($a % $b))
# output: 1# 乘方
echo $(($a ** $b))
# output: 8# 复杂运算
echo $(($a + ($a * $b)))
# output: 8
复制代码

Shell 字符串

Shell 的字符串与 PHP 的字符串相同,分为 单引号字符串双引号字符串

字符串定义

#!/bin/bash

$name="cizel"
#单引号中变量和符号不会被解析
echo 'my name is ${name}'
# output: my name is ${name}#双引号中变量和符号会被解析
echo 'my name is ${name}'
# output: my name is $shizhen
复制代码

字符串连接

#!/bin/bash

name="cizel"
echo $name $name
# output:cizel cizel
复制代码

字符串长度

#!/bin/bash

name="cizel"
echo ${#name}
# output: 5
复制代码

字符串截取

#!/bin/bash

name="my name is cizel"echo ${name:2}
# output: name is cizelecho ${name:2:5}
# output: name
复制代码

字符串删除

${变量名#substring 正则表达式} 从字符串 开头 开始配备 substring, 删除匹配上的表达式。

${变量名 %substring 正则表达式} 从字符串 结尾 开始配备 substring, 删除匹配上的表达式。

#!/bin/bash

test="/home/work/.vimrc"echo ${test#/home}
# output: /work/.vimrc
复制代码

or

#!/bin/bash

# 高级用法test="/home/work/.vimrc"# 快速获取文件名
echo ${test##*/}
# output: .vimrc# 快速获取路径
echo ${test%/*}
# output: /home/work
复制代码

字符串替换

使用内置的字符串替换,会比 awk, sed, expr 的性能更好,

${变量 / 查找 / 替换值} 一个"/"表示替换第一个,"//"表示替换所有。

#!/bin/bash

test="/home/work/.vimrc"echo ${test/.vimrc/.zshrc}
# output: /home/work/.zshrcecho ${test/w*k/cizel}
# output: /home/cizel/.vimrc
复制代码

Shell 逻辑运算

在 Shell 中,使用 test 来进行逻辑判断。与其他编程语言有许多不同,如果为真返回 0, 假返回 1.

可能的坑:

  1. 逻辑判断结果真返回 0, 假返回 1
  2. 使用 -gt, -lt, -ge, -le, -ne, -eq 替换 >, <, >=, <=, !=, = 做数值比较
  3. 与或非运算符使用 -a, -o, ! 替换 & | !

数值比较

数值比较的运算符和汇编语言中类似,常见的 5 种数值比较如下:

符号 英文解释 中文解释
-gt greater than 大于
-lt less than 小于
-ge greater equal 大于等于
-le less equal 小于等于
-ne not equal 不等于
-eq equal 等于
#!/bin/bash

# 大于
test 3 -gt 2; echo $?
# output: 0# 小于
test 3 -lt 2; echo $?
# output: 1# 大于等于
test 3 -ge 2; echo $?
# output: 0# 小于等于
test 3 -le 2; echo $?
# output: 1# 不等于
test 3 -ne 2; echo $?
# output: 0# 等于
test 3 -eq 2; echo $?
# output: 1
复制代码

字符串比较

字符串比较的运算符如下表:

符号 解释
= 字符串等于
!= 字符串不等
-z 判断字符串长度是否为零
-n 判断字符串长度是否大于零
#!/bin/bash

# 字符串等于
test "my name is cizel" = "my name is cizel"; echo $?
# output: 0# 字符串不等
test "my name is cizel" = "my name is cz"; echo $?
# output: 1# 字符串长度判断
test -z "my name is cizel"; echo $?
# output: 1
test -n "my name is cizel"; echo $?
# output: 0
复制代码

文件比较

符号 解释
-e 判断文件是否存在.
-d 判断文件是否为目录.
-f 判断文件是否为常规文件.
-L 判断文件是否为符号链接.
-r 判断文件是否可读.
-w 判断文件是否可写.
-x 判断文件是否可执行.
#!/bin/bash

ls -l# 当前目录有如下文件,lib 文件夹,run.sh 文件,sh 符号链接,当前角色:work
# drwxr-xr-x 1 work work 4096 Jun 28  2018 lib
# -rwxr-xr-x 1 work work 2364 Jul  7  2018 run.sh
# lrwxrwxrwx 1 root root  4 May 26  2014 sh -> bash# 判断文件是否存在
test -e run.sh; echo $?
# output: 0# 判断目录是否存在
test -d lib; echo $?
# output: 0# 判断文件是否为常规文件
test -f run.sh; echo $?
# output: 0# 判断文件是否为符号链接
test -L sh; echo $?
# output: 0# 判断文件是否为符号链接
test -L sh; echo $?
# output: 0# 判断文件是否可读 / 写 / 执行 (当前角色 work, 权限 rwx, 可读可写可执行)
test -r run.sh; echo $?
# output: 0
test -w run.sh; echo $?
# output: 0
test -x run.sh; echo $?
# output: 0
复制代码

逻辑连接

与其他编程语言一样,Shell 中也有与或非运算符。用于连接逻辑判断条件,形成复合的逻辑判断。

符号 英文解释 中文解释
-a and
-o or
! --
#!/bin/bash

# 与
test "1" = "1" -a "1" = "2"; echo $?
# output: 1# 或
test "1" = "1" -o "1" = "2"; echo $?
# output: 0#非
test ! "1" = "2"; echo $?
# output: 0
复制代码

Shell 选择结构

Shell 中的选择语句和其他编程语言类似,支持 if, if-else, if-elif, if-elif-else, case-esac 常见的条件选择方式

可能的坑:

  1. if 条件的左括号 ([) 后必须有一个空格,右括号前 (]) 必须有一个空格。if [空格expression空格]
  2. if, elif 后面都需要加 then 然后添加语句

if 选择

#!/bin/bash

var=`uname -s`if [ $var = "Linux" ]; thenecho "Linux System"
fi
复制代码

if-else 选择

#!/bin/bash

var=`uname -s`if [ $var = "Linux" ]; thenecho "Linux System"
elseecho "Other System"
fi
复制代码

if-elif 选择

#!/bin/bash

var=`uname -s`if [ $var = "Linux" ]; thenecho "Linux System"
elif [ $var = "FreeBSD" ]; thenecho "FreeBSD System"
fi
复制代码

if-elif-else 选择

#!/bin/bash

var=`uname -s`if [ $var = "Linux" ]; thenecho "Linux System"
elif [ $var = "FreeBSD" ]; thenecho "FreeBSD System"
elseecho "Other System"
fi
复制代码

case-esac 选择

case-esac 与常用的 switch-case 类似,可以对比 if-elif-else 选择食用

#!/bin/bash

var=`uname -s`case $var in
"Linux")echo "Linux System";;
"FreeBSD")echo "FreeBSD System";;
*)echo "Other System";;
esac
复制代码

Shell 循环结构

for 循环

常见的类似 c 语言的写法

#!/bin/bash

# 打印 1-10, 必须使用双括号,使符号转移
for ((i=1; i<=10; i++)); doecho $i
done
复制代码

in 的方法 (常用)

#!/bin/bash

for i in {1..10}; doecho $i
done
复制代码

while 循环

#!/bin/bash

count=1
while [ $count -lt 3 ]; doecho $countcount=$((count + 1))
done
复制代码

until 循环

直到条件为真时,停止循环

#!/bin/bash

count=1
until [ $count -eq 3 ]; doecho $countcount=$((count + 1))
done
复制代码

Shell 函数

Shell 函数,使用 n 的方式接收参数

#!/bin/bash

my_func() {echo "my function"echo "params 1: $1"echo "params 2: $2"echo "params 3: $3"
}my_func 1 2 3
复制代码

Shell 加载脚本

Shell 中使用 source 命令可以加载其他文件到当前 Shell 脚本中

# echo.shecho() {command printf %s\\n "$*" 2>/dev/null
}
复制代码
#!/bin/bash

source echo.shecho 123
复制代码

相关链接

  • linux 几种常见的 Shell
  • Shell 脚本编程 30 分钟入门
  • linux shell 字符串操作(长度,查找,替换)详解
  • linux shell 正则表达式 (BREs,EREs,PREs) 差异比较
  • Shell 风格指南

如何快速入手 Shell 脚本编程相关推荐

  1. 【Shell】3万字图文讲解带你快速掌握shell脚本编程

    1.快速入门 1.1.Shell介绍 shell就是人机交互的一个桥梁 :shell 本质上是 linux 命令,一条一条命令组合在一起,实现某一个目的,就变成了shell脚本.它从一定程度上 减轻了 ...

  2. 超详细shell脚本编程快速入门

    文章目录 1.shell简介 1.1 什么是shell 1.2 shell脚本 1.3 运行shell脚本 1.4 shell注释 1.5 shell编写的基本步骤 2.shell变量 2.1 命名变 ...

  3. Linux命令行与shell脚本编程大全:第2版

    <Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...

  4. Linux_《Linux命令行与shell脚本编程大全》第二章学习总结

    时间:2017年04月05日 说明:本文部分内容均摘取自书籍<Linux命令行与shell脚本编程大全>,版权归原作者所有.<Linux命令行与shell脚本编程大全>(第三版 ...

  5. 关于shell脚本编程一些有用资源的小结

    系统维护管理过程中,编写一些能减轻管理负担的shell脚本是个明智的做法,一些例程性的事务,shell脚本会比手动操作高效的多.我有时也要编写一些,总结了一些学习及参考的shell资料,实用好用为主, ...

  6. shell 脚本编程的10 个最佳实践

    每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使用命令 的种类.看待问题的方式等等.对于那些处在shell脚本 ...

  7. 关于 shell 脚本编程的10 个最佳实践

    每一个在UNIX/Linux上工作的程序员可能都擅长Shell脚 本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使用命令的种类.看待问题的方式等等.对于那些处在shell脚本 ...

  8. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she 1.1   什么是Linux 2 1.1.1 深入探究Linux 内核 3 1.1.2 GNU 工具 6 1.1.3 Linux 桌面环 ...

  9. 《Linux命令行与Shell脚本编程大全第2版.布卢姆》pdf

    下载地址:网盘下载 内容简介  · · · · · · 本书是一本关于Linux 命令行与shell 脚本编程的全面教程.全书分为四部分:第一部分介绍Linuxshell 命令行:第二部分介绍shel ...

最新文章

  1. 精度问题——直线方程的系数判断实际生产中三点能否确定一个圆
  2. [转]关于有偿提供拼图响应式后台的通知
  3. 中科院分区 2020_2020中科院期刊分区出炉!文末附2020年中科院期刊分区基础版(全)...
  4. php数据库连接程序,常用的数据库连接程序
  5. SCCM2007系列教程之九SCCM站点备份和恢复
  6. river歌曲表达的意思_闽南语歌曲《欢喜就好》详解
  7. 基于java的企业人事管理系统的设计与实现_人事管理系统如何实现企业薪酬管理升级?...
  8. (附源码)spring boot大学毕业设计管理系统 毕业设计 030945
  9. 如何改typecho主题头像_零成本搭建hexo个人博客(二)--修改主题
  10. 数据库中LIMIT和 OFFSET的理解
  11. 文献记录(part107)--Detecting Meaningful Clusters From High-Dimensional Data ...
  12. Java中的位移操作 、
  13. 编辑混合变形变形器(Blend Shape)
  14. 用express和vue构建全栈项目myweb
  15. Vitis-AI运行Emulation-HW神坑
  16. 快手抖音上热门涨粉后怎么赚钱引流变现四大技巧-阿甘电商
  17. 5G+垂直行业应用(笔记)
  18. 有关Web常用字体的研究?
  19. 微信一键群发怎么超过200好友?
  20. 优麒麟系统调整启动项顺序的经验分享

热门文章

  1. HDOJ 4003 Find Metal Mineral (树DP)
  2. java中的引用,你注意到没?
  3. .net 4.0新特性-自旋锁(SpinLock)
  4. OpenCV Contours 使用记录
  5. 2018.12.24-bzoj-2565-最长双回文串
  6. DEDECMS自定义表单unix时间戳转换成常规时间方法及增加表单添加时间方法
  7. 再谈CentOS 7程序自启动
  8. MJRefresh实现刷新(使用它的Block方法)
  9. j2ee中如何拦截jsp页面?
  10. Utility.cs