shell脚本基础(一)

shell是一个用C语言编写的程序,既是一种命令语言,又是一种程序设计语言,被称为用户使用linux的桥梁。
shell脚本(shell script)是一种为shell编写的脚本程序。

linux的shell常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh) 在linux下:/bin/sh
Bourne Again Shell(/bin/bash) 在linux下:/bin/bash
C Shell(/usr/bin/csh) 在linux下:/bin/tcsh
K Shell(/usr/bin/ksh) 是c shell的超集。
Shell for Root(/sbin/sh)
其中linux自带有:/bin/bash 、 /bin/sh 、/bin/tcsh。以上的集中都是交互式。
bash易用和免费。在日常工作中被广泛使用。
bash也是大多数linux系统默认的shell


还是从最基础走起:
hello world实例
vim first.sh
在这里插入图片描述
a.
使脚本具有权限运行
chmod 777 first.sh
执行脚本效果:
在这里插入图片描述
b.
增加解释器运行:
脚本文件内不加#!/bin/bash
/bin/bash ./first.sh
执行效果相同:
在这里插入图片描述
这样做不用赋予脚本执行权限


shell变量
例子:name=”123456”
变量名和等号之间不能有空格
变量名命名需要遵循的规则:
首个字符必须为字母(a-z,A-Z)
中间不能有空格,可以使用下划线(_)(切记切记)
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字,set查找出来的也不能使用)


变量的赋值
显式的直接赋值(可以重复为变量赋值):
name=”你好”
使用语句给变量赋值:
name=‘expr 2 + 2’
将2+2的值给变量,2 + 2是有空格的。


使用变量
使用一个定义过的变量,在其变量名前加$即可
在这里插入图片描述在这里插入图片描述
readonly命令可以将变量定义为只读变量,只读变量的值不能被改变
若我们尝试去更改制度变量:
在这里插入图片描述在这里插入图片描述

会发生如上图的错误。


删除变量:
unset命令可以删除变量(语法:unset variable_name)
变量被删除后不能再次使用。unset命令不能删除只读变量。
在这里插入图片描述在这里插入图片描述
执行完后_name是没有输出的因为被unset了
变量类型:
(1).局部变量,称为自定义变量。局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
(2).环境变量, 该也称为系统变量。所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
可使用set命令查看:


shell字符串
字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。
6.1)单引号
str=‘this is a string’
注意:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
6.2)双引号
class=‘1111’
str=“this is “$class”! \n”
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
6.3)拼接字符串
your_name=“lala”
greeting=“hello, $your_name !”
echo greeting
6.4)获取字符串长度
string=“abcdef”
echo ${#string} #输出 6
6.5)提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
string=“this is 1111 class”
echo KaTeX parse error: Expected 'EOF', got '#' at position 14: {string:1:4} #̲ 输出 his 6.6)查找子…string" is#输出 3 (注意""不能去掉) 注意: 以上脚本中 "" 是反引号,而不是单引号 “’”,不要看错了哦。
反引号`` 某些时候可用$()来替代。如:echo ll 等价于 echo $(ll)


shell数组
bash支持一维数组(不支持多维数组),且没有限定数组的大小
数组元素的下标由0开始编号
获取数组中元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0
定义数组:
在shell中,用括号来表示数组,数组元素用”空格”符号分割开。定义数组的一般形式为:
数组名=(值1 值2 值3 …… 值n)
例:
a_name=(v0 v1 v2 v3)

a_name=(
v0
v1
v2
v3
)
也可以单独定义数组的各个分量:
a_name[0]=v0
a_name[1]=v1
a_name[n]=vn
注意:我们可以不使用连续的下标,而且下标的范围没有限制
读取数组元素值的一般格式是: 数 组 名 [ 下 标 ] 例 : v a l u e n = {数组名[下标]} 例: valuen= []:valuen={a_name[n]}
使用@或者*符号可以获取数组中的所有元素
例:
echo a n a m e [ @ ] 获 取 数 组 的 长 度 获 取 数 组 长 度 的 方 法 与 获 取 字 符 串 的 方 法 相 同 , 例 : / / 取 得 数 组 元 素 的 个 数 l e n g t h = {a_name[@]} 获取数组的长度 获取数组长度的方法与获取字符串的方法相同,例: //取得数组元素的个数 length= aname[@],://length={#a_name[@]}
//或者
length=KaTeX parse error: Expected '}', got '#' at position 2: {#̲a_name[*]} 取得数组…{#a_name[n]}


shell注释
以#开头的行就是注释,会被解释器忽略(除了第一行的解释器以外)
sh里没有多行注释,每一行加一个#号
若需要将大段的代码注释起来,过段时间再取消注释怎么办。
我们可以将这段代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释同样的效果。

你可能感兴趣的:(linux)