shell脚本常用语法大全
一.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
then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
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字符串变量
- 单、双引号
name1='Jack'
str1='string1'
str2='hello,$name1'
str3="hello,\"$name1\""
echo $str1
echo $str2
echo $str3
结果为:
string1
hello,$name1
hello,“Jack”
- 单引号中字符会原样输出,因此引用变量无效,双引号里可以有变量
- 单引号中不能出现单独一个单引号,使用转义符也不行,可成对出现,用于拼接字符串,双引号中转义符有效
- 字符串拼接
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} !
- 字符串长度
name1='Jack'
echo ${#name1} #4
- 字符串提取
str1='hello, Jack !'
#从第二个字符开始截取4个字符
echo ${str1:1:4} #输出ello,索引从0开始
- 字符串查找
#查找字符串o或a,以首先出现的为准
str1='hello Jack'
echo `expr index "$str1" oa` #输出5(为啥不是4,查找字符索引不从0开始了?)
3.7shell数组
数组的下标从0开始,通过下标获取数组中的元素 。
- 创建数组
用括号表示数组,数组中的元素用空格分隔,如:name_array=(name1 name2 name3), 还可以给数组的每个元素单独赋值,如name_array[0]=name1 - 读取数组
使用${数组名[下标]},例如,name1=${name_array[0]},使用@或*可以获取数组中的所有元素,如echo ${name_array[@]} - 数组长度
#数组包含的元素的个数
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]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
5.2自定义函数
[ function ] funname [()]
{
action;
[return int;]
}
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $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/