shell脚本常用语法大全

  • 一.shell简介
  • 二.shell常用命令
    • 2.1echo
    • 2.2printf
    • 2.3test
  • 三.shell变量
    • 3.1变量命名规则
    • 3.2赋值方式
    • 3.3使用变量
    • 3.4定义只读变量
    • 3.5删除变量
    • 3.6字符串变量
    • 3.7shell数组
  • 四.shell运算符
    • 4.1算术运算符
    • 4.2关系运算符
    • 4.3逻辑运算符
    • 4.4字符串运算符
    • 4.5文件测试运算符
  • 五.shell函数
    • 5.1条件判断函数
    • 5.2自定义函数

一.shell简介

本文介绍的是shell脚本,不同于shell程序,此处是一种脚本语言,我们编写完源码之后不用编译,直接运行即可。跟 JavaScript、php 编程一样,需要一个能编写代码的文本编辑器和一个能解释执行的脚本解释器即可。在脚本中,通过#!来告诉系统其后路径所指定的程序即是解释此脚本文件的shell程序,如#!/bin/bash。通过以下两种方法来运行脚本:

  • 作为可执行程序
chmod + x ./job.sh   #使脚本具有执行权限
./job.sh  #执行
  • 作为解释器参数
/bin/bash job.sh

二.shell常用命令

2.1echo

主要功能是用于输出

echo "Hello world"  #Hello world
echo Hello world  #Hello world,双引号可省略
echo "His name is \"Jack\""  #His name is "Jack",双引号可省略
read name #从标准输入中读取一行,赋给name
echo "His name is $name"
echo -e "Hello\n world\c"  #-e为开启转义,-n换行,\c不换行
echo `date` #Mon Oct 26 14:49:46 CST 2020,``内部写命令,会输出命令执行的结果

2.2printf

printf也是一个输出命令,换行需要加\n,可以使用格式化字符串,还可以控制字符串的宽度、对齐方式等。

printf  format-string  [arguments...]
#format-string: 为格式控制字符串
#arguments: 为参数列表
$ echo "Hello, World"
Hello, World
$ printf "Hello, World\n"
Hello, World

说到格式控制,如%s %c %d %f,%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。%-3.1f 指格式化为小数,其中.1指保留1位小数。

printf "%-10s %-8s %-4s\n" 姓名 科目 成绩
printf "%-10s %-8s %-3.1f\n" 张三 语文 80.0
printf "%-10s %-8s %-3.1f\n" 李四 语文 75.5
printf "%-10s %-8s %-3.1f\n" 王五 数学 90.5
# 没有引号也可以输出
printf %s abcdef
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def
# 如果没有参数,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"  # and 0

姓名 科目 成绩
张三 语文 80.0
李四 语文 75.5
王五 数学 90.5

2.3test

用于检查某个条件是否成立,它可以进行数值、字符和文件三方面的测试。
数值测试:
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
字符串测试:
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

a=5
b=6
result=$[a+b] # 注意等号两边不能有空格,[]执行基本的算数运算
echo "result 为: $result"

另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低

if test -e ./notFile -o -e ./bash
thenecho '至少有一个文件存在!'
elseecho '两个文件都不存在'
fi

三.shell变量

3.1变量命名规则

  • 只能用英文字母、数字和下划线,且不以数字开头
  • 变量可以使用下划线连接,但不能出现空格
  • 不能有标点符号
  • 不能使用关键词
  • 给变量赋值时,变量名和等号之间不能有空格

3.2赋值方式

  • 显示赋值
name1="Jack"
  • 使用语句赋值
for file in `ls /etc`

已定义的变量,可以赋新值,虽然该变量已被定义,但重新赋值时请勿使用$,使用变量时才需要加$

name1='Tom'

3.3使用变量

已经定义过的变量,使用时加$符号即可,为了帮助识别变量名,可在变量名外加{},在不至于造成混淆的情况下,可不加。

#输出name1的值
echo $name1
echo ${name1}

3.4定义只读变量

只读变量不可以赋新值。

#使用readonly定义
name1='Jack'
readonly name1

3.5删除变量

变量被删除后则不能被使用,unset命令不能删除只读变量。

unset name1

3.6字符串变量

  1. 单、双引号
name1='Jack'
str1='string1'
str2='hello,$name1'
str3="hello,\"$name1\""
echo $str1
echo $str2
echo $str3

结果为:
string1
hello,$name1
hello,“Jack”

  • 单引号中字符会原样输出,因此引用变量无效,双引号里可以有变量
  • 单引号中不能出现单独一个单引号,使用转义符也不行,可成对出现,用于拼接字符串,双引号中转义符有效
  1. 字符串拼接
name1='Jack'
#使用双引号拼接
str1="hello, "$name1" !"
str2="hello, ${name1} !"
echo $str1 $str2
#使用单引号拼接
str3='hello, '$name1' !'
str4='hello, ${name1} !'  #无引号,原样输出
echo $str3 $str4

输出结果为:
hello, Jack ! hello, Jack !
hello, Jack ! hello, ${name1} !

  1. 字符串长度
name1='Jack'
echo ${#name1}  #4
  1. 字符串提取
str1='hello, Jack !'
#从第二个字符开始截取4个字符
echo ${str1:1:4}  #输出ello,索引从0开始
  1. 字符串查找
#查找字符串o或a,以首先出现的为准
str1='hello  Jack'
echo `expr index "$str1" oa` #输出5(为啥不是4,查找字符索引不从0开始了?)

3.7shell数组

数组的下标从0开始,通过下标获取数组中的元素 。

  1. 创建数组
    用括号表示数组,数组中的元素用空格分隔,如:name_array=(name1 name2 name3), 还可以给数组的每个元素单独赋值,如name_array[0]=name1
  2. 读取数组
    使用${数组名[下标]},例如,name1=${name_array[0]},使用@或*可以获取数组中的所有元素,如echo ${name_array[@]}
  3. 数组长度
#数组包含的元素的个数
len=${#name_array[@]}
#等价于
len=${#name_array[*]}
#数组中指定元素的长度,类似于获取字符串长度
len1=${#name_array[0]}

四.shell运算符

4.1算术运算符

val=`expr 2 + 2`
echo "$val"

注意事项:要借助expr来实现;表达式和运算符之间要有空格,即2 + 2,而不是2+2

`expr 1 + 2`  #3,加法
`expr 1 - 2`  #-1,减法
`expr 1 \* 2` #2,乘法需加反斜杠才能实现
`expr 2 / 1`  #2,除法
`expr 2 % 1`  #0,取余
a=$b  #将b的值赋给a
[ 1 == 2 ]  #比较两个数字是否相等,相等返回true 要有[]和空格,不可以写成[1==2]
[ 1 != 2 ]  #比较两个数字是否不相等,不相等返回true

4.2关系运算符

关系运算符可以用于数字或者是值为数字的字符串

[ 1 -eq 2 ]  #false,两个数是否相等
[ 1 -ne 2 ]  #true,两个数是否不相等
[ 1 -gt 2 ]  #false,左边是否大于右边
[ 1 -lt 2 ]  #true,左边是否小于右边
[ 1 -ge 2 ]  #false,左边是否大于等于右边
[ 1 -le 2 ]  #true,左边是否小于等于右边

4.3逻辑运算符

[ ! false ] #true,非运算
[ 10 -lt 20 -o 20 -gt 100 ] #true,或运算
[ 10 -lt 20 -a 20 -gt 100 ]  #true,与运算
[[ 10 -lt 100 && 20 -gt 100 ]] #false,逻辑and
[[ 10 -lt 100 || 20 -gt 100 ]] #true,逻辑or

4.4字符串运算符

a='abc'
b='efg'
[ $a = $b ]  #false
[ $a != $b ] #true
[ -z $a ] #false,检测字符串长度是否为0
[ -n $a ] #true,检测字符串长度是否不为0
[ $a ] #true,检测字符串是否不为空,不为空返回true

4.5文件测试运算符

……

五.shell函数

5.1条件判断函数

num1=100
num2=100
if test $[num1] -eq $[num2]
thenecho '两个数相等!'
elseecho '两个数不相等!'
fi

5.2自定义函数

[ function ] funname [()]{action;[return int;]}

1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

funWithReturn(){echo "这个函数会对输入的两个数字进行相加运算..."echo "输入第一个数字: "read aNumecho "输入第二个数字: "read anotherNumecho "两个数字分别为 $aNum 和 $anotherNum !"return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !" #函数返回值在调用该函数后通过 $? 来获得。
#$? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得。
function demoFun1(){echo "这是我的第一个 shell 函数!"return `expr 1 + 1`
}demoFun1
echo $?
echo $?

结果:
这是我的第一个 shell 函数!
2
0 #shell 语言中 0 代表 true,0 以外的值代表 false。


个人学习记录,仅供参考。
参考:https://www.runoob.com/

shell脚本常用语法大全相关推荐

  1. Shell脚本基本语法大全

    目录 1.如何理解Shell脚本 2.如何一行执行多条命令 3.脚本的执行 4.管道与重定向 5.变量的使用 6.数组的使用 7.转义和引用 8.运算符 9.各种特殊符号 10.测试与判断 11.分支 ...

  2. shell脚本常用语法——获得当前目录

    1 . 获得shell脚本所在的绝对路径 CURRENT_DIR=$(cd $(dirname $0); pwd) 或者 CURRENT_DIR=$(cd `dirname $0`; pwd) 执行步 ...

  3. linux脚本基本命令大全,Shell脚本常用命令

    Shell脚本常用命令 1           Shell中的特殊符号 1.1           $  美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到" ...

  4. 【shell】常用语法 -b file -c file -f file-d file -x file

    [shell]常用语法 -b file  -c file  -f file-d file  -x file      一.test条件判断 1,test文件测试: -b file     若文件存在且 ...

  5. linux 脚本 if判断 o,shell脚本常用脚本:if判断

    shell脚本常用脚本:if判断 str1 = str2当两个串有相同内容.长度时为真 str1 != str2当串str1和str2不等时为真 -n str1当串的长度大于0时为真(串非空) -z ...

  6. linux编程 —— shell编程脚本常用语法总结 【学习笔记】

    文档声明: 以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正.并且该文档在后期会随着学习的深入不断补充完善.感谢各位的参考查看. 笔记资料仅供学习交流使用,转载请标明出处 ...

  7. 每天学一点儿shell:Shell的常用语法规则

    文章目录 Shell 参数传递 Shell 数组 Shell 基本运算符 算数运算符 关系运算符 布尔运算符 逻辑运算符 字符串运算符(重点) 文件测试运算符 Shell 常用语法 Shell 函数 ...

  8. ubuntu及shell脚本常用命令入门

    一.Shell命令 二.ubuntu软件安装方法 三.Ubuntu文件系统结构 四.ubuntu磁盘文件 五.Linux下常用的压缩格式 六.linux用户和用户组 七.Ubuntu/Linux文件权 ...

  9. Shell脚本基础语法

    一.       编写shell的格式 1 第一行决定使用哪一种shell Bash:#! /bin/bash Python: #! /usr/bin/python 不知道解释器的完整路径,可使用wh ...

最新文章

  1. NVIDIA Jarvis:一个GPU加速对话人工智能应用的框架
  2. 如何自学python a byte to python-你是如何自学 Python 的?
  3. 爬虫笔记:Python Selenium详解
  4. nsfocus 十周年了 时间过得好快啊... 恭喜下...
  5. mysql自增_面试官:为什么 MySQL 的自增主键不单调也不连续?
  6. android禁用应用组件,Android彻底退出(关闭)应用程序.docx
  7. weblogic占用java_weblogic下java程序占用cpu过高的问题排查
  8. apache配置多https域名对应单个证书和多个不同的https域名对应多个不同的证书
  9. Tricks(五)—— Python 返回所有符合条件的下标
  10. js计算两个整数之间的百分比
  11. 使用vbs语言利用SecureCRT批量执行交换机命令
  12. 组建了计算机教室和图书室,【不忘初心 牢记使命】武胜这8所试点学校陆续展开课后服务工作...
  13. 车载视频监控基于JTT808/1078管理平台商业开源
  14. java syn包_TCP攻击之SYN攻击
  15. 数据集-知识图谱:FreeBase(通用知识图谱)【英文】
  16. Python 网络爬虫从0到1 (2):网络爬虫的特性、问题与规范
  17. 芒果超媒的2022年报:一半明媚,一半忧伤
  18. TSINGSEE青犀视频平台人脸识别比对控制比对时间间隔的代码设计
  19. 江在川上曰:less样式预编译
  20. jzyzoj 1216 poj虫洞 3259 Bellman_Ford模板

热门文章

  1. HotSpot C1编译器与栈上替换
  2. 前端处理图片的几种方式
  3. 征服Java面试官!Java程序员月薪20k的涨薪秘籍,先收藏了
  4. C:使用mtrace、memwatch、dmalloc检测内存泄漏
  5. WinHTTP中的HINTERNET句柄
  6. 【HTML CSS】笔记2日 CSS基础
  7. mysql select查询语句大全
  8. 音乐推荐相关API接口
  9. MySQL8.0向NOT NULL的TIMESTAMP类型字段插入NULL值的问题
  10. 210:例子1:6个垃圾桶是否满的信息读取VSCODE实现