Shell脚本学习
创始人
2024-04-06 13:15:33
0

一、介绍

shell是一个用C语言编写的程序,是使用Liunx的桥梁。shel既是一种命令语言,又是一种设计语言,它提供一个界面(小黑屏),用户通过这个界面访问操作系统内核的服务。

在我们通常说的shell一般说的是shell script(shell脚本)。但学习者还是需要知道shell 和shell script两者是不同的概念。由于习惯问题,所以shell都是指shell脚本编写。

shell编程和JavaScript、PHP一样,除了文本编辑外就只需要一个能解释执行的脚本解释器就可以了。Linux的shell种类有很多,常见的有

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)

二、初识Shell脚本

shell脚本扩展名为sh,但实际扩展名并不影响脚本执行,见名知意就好。

#!/bin/bash
echo "Hello World !"
  • 文件开头说明

    #! 是shell的约定标记,它告诉系统这个脚本需要什么解释器执行,#!/bin/bash 代表Bash方式执行。

  • 授权为可执行程序

    chmod +x ./test.sh  #使脚本具有执行权限
    
  • 执行

    ./test.sh # 或者指定解释器运行,这种方式不需要在第一行指定解释器信息,指定了也没用。
    /bin/sh ./test.sh
    

三、shell变量

3.1、声明变量

test_name="xiaoMing"

变量名和等号之间不能有空格。

  • 直接声明变量名,不用加其他符号
  • 变量名只能使用英文、数字和下划线,且不能以数字开头

3.2、使用变量

test_name="xiaoMing"
echo $your_name
# 推荐使用这个
echo ${your_name}

加大括号可以帮助解释器识别变量边界,所以推荐所有变量名都加上大括号,这是个编程的好习惯

3.3、设置只读变量

test_name="xiaoMing"
readonly  $your_name

如果将变量设置为只读,后面重新赋值,在运行时就是执行报错: /bin/sh: NAME: This variable is read only.

3.4、删除变量

unset variable_name

3.5、变量类型

运行shell时,会同事存在三种变量

  • 局部变量

    局部变量在脚本或者命令中定义,仅在当前shell实例中有效

  • 环境变量

    所有的程序,包含shell启动的程序,都能访问的环境变量

  • shell变量

    shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

四、Shell字符

4.1、单引号

str='123'

单引号里不能引用变量名,除非单引号里再嵌套个单引号里引用变量。并且不是出现一个单引号,除非成对出现,作为字符串拼接

4.2、双引号

hi="Hello World"
name="${hi} shenyao"
echo ${name}

使用双引号的优点

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

4.3、拼接字符

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"# 使用单引号拼接
greeting_2='hello, '$your_name' !'

4.4、获取字符长度

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

4.5、截取字符

name="123";
name2=${name:0:2} //12
  • 截取字符,一个是从哪个开始截取,第二个数代表要截取多少个

五、数组

shell数组支持一维数组,并且没有限制数组的大小,可以通过索引访问元素。

5.1、数组定义

  • 直接声明

    array_name=(value0 value1 value2 )array_name=('111' '2222 22' '3333')
    
  • 换行

    array_name=(
    value0
    value1
    value2
    )
    
  • 可以单独定义各个值

    array_name[0]=value0
    array_name[1]=value2
    
  • 不仅可以使用索引赋值,也可以用任意字符来关联元素

    首先使用declare 关键字声明为关联数组

    declare -A array_namearray_name["google"]="www.google.com"
    array_name["runoob"]="www.runoob.com"
    array_name["taobao"]="www.taobao.com"
    

5.2、读取数组

${数组名[索引下标]}value=${array_name[0]}#@符号获取所有元素
values=${array_name[@]}

5.3、获取数组长度

获取字符串长度时使用${#string} ,数组长度也类似使用#

length=${#array_name[@]}
#或者
length=${#array_name[*]}

六、传递参数

在运行shell脚本时,有时我们需要在执行脚本时传递参数。脚本内获取参数的格式为:$n。n代表一个数字,其中$0代表里执行的文件名,从1开始才是真正传的参数,$1代表第一个传递的参数,$2代表第二个传递的参数

例如

#执行脚本
./test.sh 1 2 3# 脚本内容
#!/bin/bas
echo "shell 传递参数示例开始"
# 执行的文件名
echo "执行的文件名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"shell 传递参数示例开始
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2

其他引用列表

参数说明
$#传递参数的个数
$*传递的所有参数
$$脚本运行的当前进程ID号
$@$*相同,但是传参的时候需要使用引号括起来,否则它就当成一个参数

七、基本运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如:awk,expr,let最常用。

val=`expr 2 + 2`

注意
1、表达式何运算符质检要有空格,例如2+2是不对,要 2 + 2,

2、表达式要用``包裹起来,

let s=(2+4)*4

注意

1、运算符和参数之间不能有空格
2、与expr对比,let命令更简洁直观
3、let使用位操作符<< >>&需要用\ 来转义

7.1、算术运算符

运算符说明
+加法
-减法
*乘法
/除法
%取余
=赋值
==判断相等,用于比较两个数字,相同返回true。只能用于数字类型且在if判断中使用
!=判断不相等,不相同则返回 true。

7.2、关系运算符

该运算符只支持数字

运算符说明
-eq检查两个数是否相等
-ne不相等
-gt大于
-lt小于
-ge大于等于
-le小于等于

7.3、布尔运算符

运算符说明
!非运算,取反的作用
-o或运算,相当于`
-a且运算,相当于&,两个表达式为true才返回true

7.4、逻辑运算符

运算符说明
&&and
||OR

7.5、字符串运算符

运算符说明
=两个字符串是否相等
!=是否不相等
-z长度是否为0
-n长度是否不为0
$是否不为空

7.6、文件测试运算符

操作符说明
-d file文件是否是目录
-r file是否可读
-w file是否可写
-x file是否可执行
-s file是否为空
-e file文件(包含目录)存在

八、echo命令

echo是一个输出命令,格式如下

echo string

获取控制台输入

read name
echo "${name} 你好"

执行后脚本,name变量作为控制台输入的变量

./test.sh
xiaoMing   #控制台输入
xiaoMing 你好  #输出

九、printf

printf和echo都是输出命令,但printf的脚本比echo移植性高。比如可以传参数

示例

printf "你好吗? %s \n" 小明#打印出来就是
你好吗? 小明
  • 格式化输出

    printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
    
    符号说明
    %s替换符,s声明是字符串的意思
    %-10s指定一个宽度为10个字符,-表示左对齐,没有则右对齐。不满10字符会自动空格值填充,超过也全部显示
    %c%c是输出一个字符
    %f数字类型
    %-5.3f数字类型,占5个字符,超过也展示,保留3位小数

十、流程控制

if判断里可以用[...]((...))。 使用[...] 判断大小用-gt-lt ,使用((...))可以用><

10.1、if

if [条件]
then满足后执行命令
fi

10.2、if…then…else

if [条件]
thenecho '两个数字相等!'
elseecho '两个数字不相等!'
fi

10.3、if…then…elif…

if [条件1]
then满足条件1执行
elif [ 条件2 ]
then满足条件2执行
else都不满足执行
fi

10.4、for循环

  • for in 类型

    for loop in 1 2 3 4 5
    doecho "The value is: ${loop}"
    done
    
    array_name=('一' '二' '三')
    for var in ${array_name[*]}
    doecho "值为: ${var}"
    done
    
  • for i 类型

    fori 模式和其他编程语法差不多

      
    array_name=('一' '二' '三')
    for(( i=0;i<${#array_name[*]}; i++ ))
    doecho "值为: ${array_name[i]}"
    done
    

10.5、while

while [条件]
do执行命令
done

示例

#!/bin/basharray_name=('一' '二' '三')
num=${#array_name[*]}echo "长度为--> ${num}"
while [ ${num} -ge 0 ]
doecho "该值为:${array_name[${num}]}"let "num--"
done

相关内容

热门资讯

李光洁32天走7500公里吃8... 李光洁32天走7500公里吃8城,《拿一座城市下酒》这部纪录片怎么样?我觉得这部纪录片非常好,观看的...
每我世如你果只没界喜就欢的生一... 每我世如你果只没界喜就欢的生一爱有你过在想会。把这22个字组成一句话。我想过,如果在每一生只喜欢你,...
调查校园里的植物和动物说说有哪... 调查校园里的植物和动物说说有哪些动植物?可以分成几类?兰花,梅花可人丌··植物:乔木(杨树、柳树、银...
血脂高的原因? 血脂高的原因?血脂高的原因高血脂的诱因包括原发性和继发性两种:原发性高血脂症的病因:1、遗传因素。2...
为什么孩子总是重复看同一集动画... 为什么孩子总是重复看同一集动画片?是在传递这3个信号 小孩子爱看动画片是非常普遍的,动画片带给他们动...
终极三国里 49集刘备为什么这... 终极三国里 49集刘备为什么这么做?有没有官方回答?下集自己看吧 现在不会有官方回答的哟第一:可能真...
西式糕点制作大全的内容简介 西式糕点制作大全的内容简介《西式糕点制作大全》主要介绍了制作甜点的基本知识,例如各种制作工具,制作点...
逻辑思维又是什么?就是推理吗,... 逻辑思维又是什么?就是推理吗,怎么培养!?逻辑思维是一种严格分析思维。不一定是推理。推理是逻辑思维的...
囊萤夜读有一句俗语就是出自这个... 囊萤夜读有一句俗语就是出自这个故事你知道是什么吗?囊萤映雪 ( náng yíng yìng xuě...
什么是不伦恋情? 什么是不伦恋情?什么是不伦恋情.,?男跟女年龄相差很大?还是?男的比女的小?还是老夫少妻?是近亲谈恋...
有书名带晨星的嘛? 有书名带晨星的嘛?有书名带晨星的嘛?晨星传这本书。漫画书晨星物语
如果有些事情说不出口怎么办? 如果有些事情说不出口怎么办?烦恼皆是因为自己过分的执着 即使你在这样子下去 更不就不会有好的结果 为...
有哪些类似于《非自然死亡》题材... 有哪些类似于《非自然死亡》题材的日剧推荐?非自然死亡的题材电影确实不多,电视剧的话也不好找啊。不喜欢...
素书全集的内容简介 素书全集的内容简介 本书采用了《素书》的权威原著,参照《四库全书》并加上了宋代宰相张商英的注和清代王...
【世纪花园】小区对口的学校有重... 【世纪花园】小区对口的学校有重点小学和初中吗?世纪花园东区里有未来强者幼儿园,小区南边有个华兴小区,...
东南大学现有的专业中有哪些是属... 东南大学现有的专业中有哪些是属于老东南的1928年学校改名为国立中央大学,设理、工、医、农、文、法、...
一个男人一有钱就请朋友吃饭,没... 一个男人一有钱就请朋友吃饭,没钱就又说,买东西还赊账,商店里的老板都找上门来了?像陵念前这种男人的话...
坟上栽什么草好? 坟上栽什么草好?坟地种什么草好耐旱坟上栽野蕨草、扎根不深、浅根植物、可以固土、南方雨水多、不会造成坟...
关于国富潜力基金 关于国富潜力基金我9月24日上午买的国富基金,申购价格是9月24日开盘的价格吗?还是9月28日开盘的...
我是一个高中生。想学武术。在学... 我是一个高中生。想学武术。在学校没什么时间。是练散打还是跆拳道好。我是一个高中生。想学武术。在学校没...