IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> shell 脚本编程基本语法使用合集 -> 正文阅读

[系统运维]shell 脚本编程基本语法使用合集


注:请注意红色标注部分

一:语法

1. 变量

1.变量名规范

  1. 名称只能使用英文字母,数字和下划线,不能是数字开头
  2. 名称中间不能有空格
  3. 不能使用标点符号
  4. 不能使用bash里面的关键字

2.变量使用

  1. 使用变量的时候可以用 变 量 名 也 可 以 用 变量名也可以用 {变量名}。这里的{}的作用是用来区分变量的边界的,像是下面这种情况中,加不加{}都可以
// 声明变量
var1="test var"
// 使用变量
echo $var1
echo ${var1}

注:在声明变量的时候,变量名,=,变量值三者之间不可以有空格哦

在使用变量的时候是否需要加{}取决于编译器能否正确识别出变量名
如:

i=2
echo "$is"
echo "${i}s"

如上面这种情况,当使用变量i的时候,就需要用{i}。是因为$is这种没有空格分隔的写法,编译器无法识别出变量名是i还是is,那么就会将变量名作为is来编译。通过上面代码中的颜色也可以很清楚的看出来变量引用部分,为黄色

单引号和双引号的区别:
echo ‘’ 的时候,会把‘’中的内容原样输出
echo ""的时候,如果有包含变量的时候,那么$变量会生效

i=0
echo '$i'
echo "$i"

输出:
$i
0

2. 脚本参数传递

变量意义
$#传递到脚本的参数个数
$*以单字符的方式显示传递的所有参数
$$脚本当前运行的进程ID
$!后台运行的最后一个进程的ID
$@分开显示传递的所有参数
$?显示最后命令退出的状态,0表示正常,其他值表示有错误
[root@centos7-01 an]#  sh a.sh c1 c2 c3 c4
4
c1 c2 c3 c4
22430

c1 c2 c3 c4
0
c1
c3
[root@centos7-01 an]#  cat a.sh
#!/bin/bash
echo "$#"       ---- 4
echo "$*"       ---- c1 c2 c3 c4
echo "$$"		---- 22430
echo "$!"       ----
echo "$@"		---- c1 c2 c3 c4
echo "$?"		---- 0
echo "$1"		---- c1
echo "$3"		---- c3

3. 数组

  1. 定义:数组用括号来表示,用空格符号分隔开。
    如array_name=(value1 value2 … valuen)
  2. 也可以通过arr[1]='xxx’的方式来进行赋值
  3. 读取数组元素:${arr_name[index]}
  4. 一次性获取数组中的所有元素:$ {arr_name[*]}或者$ {arr_name[@]}
  5. 获取数组的长度:$ {#arr_name[*]}或者${#arr_name[@]}

[root@centos7-01 an]#  cat a.sh
#!/bin/bash

# 定义数组
myArr=(1 2 A df)

echo "数组长度为${#myArr[*]}"
myArr[4]="89"
echo "增加元素后,数组长度为${#myArr[@]}"
echo "第三个元素是${myArr[2]}"
echo "输出所有元素:${myArr[*]}"
echo "输出所有元素:${myArr[@]}"


[root@centos7-01 an]#  sh a.sh c1 c2 c3 c4
数组长度为4
增加元素后,数组长度为5
第三个元素是A
输出所有元素:1 2 A df 89
输出所有元素:1 2 A df 89

4. 运算符

原生的shell是不支持运算符的,但是可以通过一些其他命令来实现shell运算的功能。如awk何expr

  1. expr:表达式计算工具,使用的时候需要反引号来指定,即``,而且运算符和数值之间需要用空格隔开
[root@centos7-01 an]# cat a.sh 
#!/bin/bash

echo `expr 2 + 2`

a=2
b=4
#注意如果是*运算符,需要进行转义
echo `expr $a \* $b`
[root@centos7-01 an]#  sh a.sh 
4
8

5. if

  1. 语法: if [ 关系表达式 ]
[root@centos7-01 an]#  sh a.sh 
2!=4
[root@centos7-01 an]# cat a.sh 
#!/bin/bash

a=2
b=4

if [ $a -eq $b ] 
then
  echo "$a==$b"
else
  echo "$a!=$b"
fi

  1. 支持的运算符
运算符含义示例
-eq两个数是否相等[ $a -eq $b ]
-ne两个数是否不相等[ $a -ne $b ]
-gt是否是大于的关系[ $a -gt $b ]
-lt是否是小于的关系[ $a -lt $b ]
-ge是否是大于等于的关系[ $a -ge $b ]
-le是否是小于等于的关系[ $a -le $b ]
!非运算符[ !false ]
-o或运算符[ true -o false ]
-a且运算符[ $a = $b -a false]
=左右是否相等[ $a = $b ]
!=左右是否不等[ $a != $b ]
-z长度是否为0[ -z $a ]
-n长度是否不为0[ -n “$a” ]
$是否为空[ $a ]

注:对于逻辑运算符,需要使用[[ ]] 双中括号来运行

逻辑运算符含义示例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]]
||逻辑的 OR[[ $a -lt 100 || $b -gt 100 ]]
[root@centos7-01 an]# cat a.sh 
#!/bin/bash

a=2
b=4

if [ $a -eq $b ] 
then
  echo "$a==$b"
else
  echo "$a!=$b"
fi

if [ $a -ne $b ] 
then 
echo "$a-ne$b"
fi

if [ $b -gt $a ]
then 
echo "$b-gt$a"
fi

if [ $a -lt $b ]
then
echo "$a-lt$b"
fi

if [ $b -ge $a ]
then
echo "$b-ge$a"
fi

if [ $a -le $b ]
then
echo "$a-le$b"
fi

if [ ! $a -ge $b ]
then
echo "!$a -ge $b"
fi

if [ $a -ge $b -o $a -lt $b ]
then
echo "$a -ge $b -o $a -lt $b"
fi

if [ $a -le $b -a $a -lt $b ]
then
echo " $a -le $b -a $a -lt $b "
fi

if [ $a = `expr $b - 2` ]
then
echo " [ $a = `expr $b - 2` ] "
echo ' [ $a = `expr $b - 2` ] '
fi

if [ -z '' ]
then
echo "[ -z '' ]"
fi

if [ -n $a ]
then
echo "[ -n $a ]"
fi

if [ $a ]
then
echo "[ $a ]"
fi

输出结果:
[root@centos7-01 an]#  sh a.sh 
2!=4
2-ne4
4-gt2
2-lt4
4-ge2
2-le4
!2 -ge 4
2 -ge 4 -o 2 -lt 4
 2 -le 4 -a 2 -lt 4 
 [ 2 = 2 ] 
 [ $a = `expr $b - 2` ] 
[ -z '' ]
[ -n 2 ]
[ 2 ]

  1. 支持的文件运算符
运算符含义
-b文件是否是块设备文件
-c文件是否是字符设备文件
-d文件是否是目录
-f文件是否是文件(非设备文件)
-g文件是否设置了SGID 位
-k文件是否设置了粘着位(Sticky Bit)
-p文件是否是有名管道
-u文件是否设置了 SUID 位
-r文件是否可读
-w文件是否可写
-x文件是否可执行
-s文件是否为空即文件大小是否为0
-e文件是否存在

6. for

[root@centos7-01 an]# cat b.sh 
#!/bin/bash

myArr=( 1 2 3 4 )

for i in ${myArr[*]}
do
echo $i
done

for i in a b c d
do
echo $i
done

[root@centos7-01 an]# sh b.sh 
1
2
3
4
a
b
c
d

7. while

  1. 语法格式
    while (( ))
    do
    xxx
    done
[root@centos7-01 an]# cat b.sh 
#!/bin/bash

i=1

while(( $i<= 5 ))
do
echo "$i"
i=`expr $i + 1`
done
[root@centos7-01 an]# sh b.sh 
1
2
3
4
5

无限死循环

#!/bin/bash
i=1
while :
do
echo "$i"
done
#!/bin/bash
i=1
while true
do
echo "$i"
done

#!/bin/bash
i=1
for (( ; ; ))
do
echo "$i"
done

8. until

[root@centos7-01 an]# sh b.sh 
1
[root@centos7-01 an]# cat b.sh 
#!/bin/bash
i=1

until [ $i -eq 0 ]
do
echo "$i"
i=0
done

9. case

case xxx in
	1) command
	;;
	2) command
	;;
	*) command 
	;;
esac

case 标识着case命令的开始
esac标识着case命令的结束
n)标识着一个特定的取值模式,n可以一个明确的值,也可以是枚举
;; 标识该模式匹配的结束
*)相当于是的default

[root@centos7-01 an]# cat b.sh 
#!/bin/bash
i=you

case $i in
1) echo "i like"
;;
"you") echo "you like"
;;
*) echo "all like"
esac
[root@centos7-01 an]# sh b.sh 
you like

10. break,continue

break标识跳出一个循环:for,while,until
continue标识停止当前循环,直接开启下一次循环

11. function

[ function ] funname [()]

{

    action;

    [return int;]

}

示例

[root@centos7-01 an]# sh b.sh 
1
10
13
[root@centos7-01 an]# cat b.sh 
#!/bin/bash
i=you
# 定义一个函数
function myFun(){
echo "$1"
echo "$10"
echo "${10}"
}

# 调用函数
myFun 1 2 3 4 5 6 7 8 9 13 14 15


需要注意的是,当使用参数的时候,如果参数的个数超过10个的话,那么大于等于第10个的参数的使用需要时$ {n}的格式,而不是$ n,从上面的例子中也可以看出来,当使用$ 10的时候,输出的是10,但是使用$ {10}的时候输出的是真实的第10个数字

12. 重定向

  1. command > file :将command的执行结果完全输出到file中,覆盖file操作
  2. command >> file:将command的执行结果输出到file中,追加file操作】
  3. command < file:将file作为输入,来执行command
  • 标准输入文件(stdin):文件描述符为0;如command < file,会把file作为stdin
  • 标准输出文件(stdout):文件描述符为1;如command > file, 会把stdout重定向到file
  • 标准错误文件(stderr):文件描述符为2;如command 2>file,会把stderr重定向到file

command > file 2>&1:会把stdout和stderr合并输出到file中

13. Here Document

command << delimiter
    document
delimiter

如上述语法中,会把delimiter之间的document作为stdin给command

[root@centos7-01 an]# sh b.sh 
3
[root@centos7-01 an]# cat b.sh 
#!/bin/bash
wc -l << delimiter
2
3
4
delimiter

14. /dev/null

/dev/null 作为一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

常用法:可以使用$ command > /dev/null 2>&1 来屏蔽输出

15. printf

语法:

printf format-string [ args... ]

format-string:格式控制字符串
args:参数列表

格式化字符意义
%[-n]s字符串 ,如果指定了n的话,那么字符串就会显示在10个字符宽内,长度不够的话不空格,如果长度大于10个字符全部显示。如果指定了-表示左对齐,否则就是右对齐
%d整数
%c单个字符
%[-n.m]f小数, m指的是格式化为即为小数
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-05 11:27:40  更:2021-09-05 11:28:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 13:31:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码