Shell 基本语法

变量命名

定义变量时,变量名不加美元符号($)
注意,变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可

a=10
echo "a=$a"

返回结果:

a=10

只读变量

使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变

#!/bin/bash
myUrl="https://cnblogs.com/tenic"
readonly myUrl
myUrl="https://www.google.com"

返回结果

myUrl: readonly variable

删除变量

使用unset命令可以删除变量,删除后不能再次使用

unset myUrl

shell 字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

  • 单引号
str='this is a string'
echo $str

返回结果:

this is a string

单引号字符串的限制:

  1. 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  2. 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
  • 双引号
your_name='tenic'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

输出结果为:

Hello, I know you are "tenic"! 

双引号的优点:

  1. 双引号里可以有变量
  2. 双引号里可以出现转义字符
  • 拼接字符串
your_name="tenic"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

输出结果为:

hello, tenic ! hello, tenic !
hello, tenic ! hello, ${your_name} !
  • 获取字符串长度
string="abcd"
echo ${#string} #输出 4
  • 提取子字符串
    以下实例从字符串第 2 个字符开始截取 4 个字符:
string="cnblogs is a great site"
echo ${string:1:4} # 输出 nblo

注意:第一个字符的索引值为 0。

  • 查找子字符串
    查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="cnblogs is a great site"
echo `expr index "$string" io`  # 输出 4

注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。

Shell 注释

  • 单行注释
    以 # 开头的行就是注释,会被解释器忽略。
    通过每一行加一个 # 号设置多行注释,

  • 多行注释
    当需要注释多行代码时,可以使用:<<EOF... EOF格式
    EOF可以使用其他符号,比如!或者'

:<<!
注释内容。。。
注释内容。。。
注释内容。。。
!

传输参数

我们在执行shell脚本的时候,可以向shell脚本中传递参数,在shell脚本中使用这些传入的参数
在脚本中使用 $N,N代表数字,1,2,3

echo "接收的第一个参数是:$1"
echo "接收的第二个参数是:$2"

使用特殊字符来处理参数接收

echo '测试$*'
for i in "$*";do
  echo i;
done

echo '测试$@'
for i in "$@";do
  echo i
done

返回结果

./demo1.sh a b c
测试$*
a b c
测试$@
a
b
c

$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

默认是只有9个参数,那如果我们要取第10个参数要怎么取呢?
echo "第10个参数${10}"

算术运算符

shell和其他编程一样,支持包括:算术,关系,布尔,字符串等运算符。
原生bash不支持简单的数学运算,单是可以通过其他命令来实现,例如expr
expr是一款表达式计算工具,使用它能完成表达式求值操作。
使用expr表达式时要注意:
操作数和运算符之间要有空格,eg:2 + 2,而不能写成2+2
完整的表达是要被`包含
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20

布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20

逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20

字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg"

程序流程

1.条件分支结构
1.1 if条件分支
常用的判定条件运算符:
只支持数字,不支持字符串,除非字符串的值是数字

#! /bin/bash
a=20
b=10
#单if模式
if [ $a -gt $b ];then
  echo "a大于b"
fi
#双分支模式
scores=66
if [ $scores -gt 60 ];then
  echo "成绩合格"
else
  echo "成绩不合格"
fi
#多分支结构
scores02=95
if [ $scores02 -gt 90 ];then
  echo "成绩优秀"
elif [ $scores02 -gt 80 ];then
  echo "成绩良好"
elif [ $scores02 -gt 70 ];then
  echo "成绩中等"
elif [ $scores02 -gt 60 ];then
  echo "成绩及格"
else
  echo "成绩不及格"
fi

1.2 case条件分支

用case语句匹配一个值于一个模式,如果匹配成功,执行匹配的命令
取值后面必须位单词 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;(类似java中的break)。
取值将检测匹配每一个模式,一旦匹配,则执行完匹配模式相应命令后,不在继续其他模式。如果无一匹配模式,使用* (类似java中的default)捕获该值,在执行后面的命令。

#!/bin/bash
a=20
case $a in
  10) echo "a的值是10"
  ;;
  20)echo "a的值是20"
  ;;
  *) echo "a的值不是10也不是20"
  ;;
esac

循环结构

1.for循环
使用循环遍历1-5

#! /bin/bash
echo "第一种方式"
for i in 1 2 3 4 5; do
  echo $i
done

echo "第二种方式"
for i in (1..5); do
  echo $i
done

echo "使用循环遍历1-5中的奇数,1-5,步长是2"
for i in (1..5..2);do
  echo $i
done

echo "使用遍历访问目录下的内容"
for i in 'ls /';do
  echo $i
done

2.while循环
计算1加到10的值

#!/bin/bash
sum=0
i=1
while [ $i -ge 10 ];do
  sum=$[sum + i]
  i=$[i + 1]
done

echo $sum

每个1秒打印一次系统时间


#!/bin/bash
while true;do
  date
  sleep 1
done

break和continue
break是结束所有循环

#!/bin/bash
i=1
while true; do
  if [ $i -gt 10 ];then
    break;
  fi
  echo $i
  date
  sleep1
  i=$[i + 1]
done

continue是结束本次,进入下次循环

#!/bin/bash
for i in (1..20);do
  if test $[ i % 3] -eq 0;then
    continue
  fi
  echo $i
done

3 util 循环
until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

until condition
do
    command
done
condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环

函数

#!/bin/bash
print(){
	echo "this is my first function"
}

echo "调用函数print开始"
print
echo "调用函数print结束"
  • 函数传参
    调用函数时可以向其传递参数,在函数体内部,通过$n的形式来获取参数的值,注意:$10不能获取到第10个参数,要使用${10}来获取
#!/bin/bash
print(){
	echo "第一个参数是:$1"
	echo "第10个参数是:${10}"
}
print 1 2 3 4 5 6 7 8 9 10 11
  • 返回值
add(){
	return $[ $1 + $2 ]
}
add 1 2
echo $?   # $?可以获取最后命令执行的结果作为返回值使用

数组

特点
bash中的数组只支持一维数组
初始化时不需要定义数组大小
数组元素的下标由0开始
用括号表示,元素用空格符号分隔开

  • 读取数组
#!/bin/bash
arr01=(1 3 "a" "abc")
echo "数组第一个元素${arr01[0]}"
echo "数组最后一个元素${arr01[10]}"
echo "读取数组全部数据${arr01[*]}"
echo "读取数组的长度:${#arr01[*]}"

arr01[3]="dff"
echo "修改后的数组全部数据为${arr01[*]}"
  • 遍历数组
for i in ${arr01[*]};do
 echo $i
done

函数引用

使用source 来加载另外一个shell脚本
或者使用 .来加载

#! /bin/bash
source ./demo11.sh

for i in ${arr01[*]};do
  echo $i
done
posted @ 2021-03-31 00:41  Tenic  阅读(252)  评论(0编辑  收藏  举报