SHELL基础语法

变量

1、使用变量

your_name="qinjx"
echo $your_name
echo ${your_name}

注意:变量名外的花括号时可选的加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

2、只读变量

#!/bin/bash
myUrl="http://www.w3cschool.cc"
readonly myUrl
myUrl="http://www.runoob.com"

3、删除变量

#!/bin/sh
myUrl="http://www.runoob.com"
unset myUrl
echo $myUrl

字符串

1、单引号

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"

限制:

  1. 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效
  2. 单引号字符串中不能出现单引号,对单引号使用转义符后也不行

2、双引号

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"

优点:

  1. 双引号里可以有变量
  2. 双引号里可以出现转义字符

3、获取字符串长度

string="abcd"
echo ${#string} #输出 4

4、截取字符串

假设有变量 var=http://www.aaa.com/123.htm


1、# 号截取,删除左边字符,保留右边字符

echo ${var#*//}

其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm


2、## 号截取,删除左边字符,保留右边字符

echo ${var##*/}

##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/
结果是 123.htm


3、%号截取,删除右边字符,保留左边字符

echo ${var%/*}

%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com


4、%% 号截取,删除右边字符,保留左边字符

echo ${var%%/*}

%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:


5、从左边第几个字符开始,及字符的个数

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:


6、从左边第几个字符开始,一直到结束

echo ${var:7}

其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm


7、从右边第几个字符开始,及字符的个数

echo ${var:0-7:3}

其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123


8、从右边第几个字符开始,一直到结束

echo ${var:0-7}

表示从右边第七个字符开始,一直到结束。
结果是:123.htm


注意:左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示

5、查找字符串

查找字符 “i 或 s” 的位置:

string="runoob is a great company"
echo `expr index "$string" is`  # 输出 8

数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

1、定义数组

在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

2、读取数组

读取数组元素值的一般格式是:

${数组名[下标]}

使用@符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

3、获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

注释

如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

参数传递

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

特殊字符

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$-显示Shell使用的当前选项,与set命令功能相同
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"

注意:echo $[2+2] ,执行结果和上面相同

1、算数运算符

+   加法
-   减法
*   乘法
/   除法
%   取余
=   赋值
==  相等,用于比较两个数字,相同返回true
!=  不等,用于比较两个数字,不相同返回true

2、关系运算符

-eq 检测两个数是否相等,相等返回 true
-ne 检测两个数是否不相等,不相等返回 true
-gt 检测左边的数是否大于右边的,如果是,则返回 true
-lt 检测左边的数是否小于右边的,如果是,则返回 true
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true
-le 检测左边的数是否小于等于右边的,如果是,则返回 true

3、布尔运算符

!   非运算,表达式为 true 则返回 false,否则返回 true
-o  或运算,有一个表达式为 true 则返回 true
-a  与运算,两个表达式都为 true 才返回 true

4、逻辑运算符

&&  逻辑AND
||  逻辑OR

5、字符串运算符

=   检测两个字符串是否相等,相等返回 true
!=  测两个字符串是否不相等,不相等返回 true
-z  检测字符串长度是否为0,为0返回 true
-n  检测字符串长度是否不为0,不为0返回 true
str 检测字符串是否为空,不为空返回 true

6、文件测试运算符

-b  检测文件是否是块设备文件,如果是,则返回 true
-c  检测文件是否是字符设备文件,如果是,则返回 true
-d  检测文件是否是目录,如果是,则返回 true
-f  检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true
-g  检测文件是否设置了 SGID 位,如果是,则返回 true
-k  检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true
-p  检测文件是否是有名管道,如果是,则返回 true
-u  检测文件是否设置了 SUID 位,如果是,则返回 true
-r  检测文件是否可读,如果是,则返回 true
-w  检测文件是否可写,如果是,则返回 true
-x  检测文件是否可执行,如果是,则返回 true
-s  检测文件是否为空(文件大小是否大于0),不为空返回 true
-e  检测文件(包括目录)是否存在,如果是,则返回 true

echo命令

echo -e "OK! \n"    # -e 开启转义
echo -e "OK! \c"    # -e 开启转义 \c 不换行

printf命令

printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n

printf 命令的语法:

printf  format-string  [arguments...]

实例

#!/bin/bash     
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

实例

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

代码中的 [] 执行基本的算数运算,如:

#!/bin/bash

a=5
b=6

result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"

流程控制

1、if 语句语法格式

if condition
then
    command1 
    command2
    ...
    commandN 
fi

2、if else 语法格式

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

3、if else-if else 语法格式

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

4、for循环语法格式

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

5、while循环语法格式

while condition
do
    command
done

6、until 语法格式

until condition
do
    command
done

7、case语法格式

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

8、break

跳出循环

9、continue

执行下一次循环

函数

shell中函数的定义格式如下:

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

说明:

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

1、函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…

注意: 10 不 能 获 取 第 十 个 参 数 , 获 取 第 十 个 参 数 需 要 10 不能获取第十个参数,获取第十个参数需要 10{10}。当n>=10时,需要使用${n}来获取参数。

调试

sh -x xxx.sh

使用这条命令来执行脚本,会输出脚本每一步的执行过程

推荐

SHELL编程的经典书籍:
链接: https://pan.baidu.com/s/1plJuGn4x7Z2xeTTgDGsBXg  密码: 7ooj

人工智能,机器学习
链接: https://pan.baidu.com/s/1K6PzTGj_bLzjeSIL4qBV7Q  密码: fl6m
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值