Linux下shell脚本:bash的介绍和使⽤(详细)
Shell:⼀般我们是⽤图形界⾯和命令去控制计算机,真正能够控制计算机硬件(CPU、内存、显⽰器等)的只有操作系统内核(Kernel),由于安全、复杂、繁琐等原因,⽤户不能直接接触内核,需要另外再开发⼀个程序,让⽤户直接使⽤这个程序;该程序的作⽤就是接收⽤户的操作(点击图标、输⼊命令),并进⾏简单的处理,然后再传递给内核,内核和⽤户之间就多了⼀层“中间代理”,Shell 其实就是⼀种脚本语⾔,也是⼀个可以⽤来连接内核和⽤户的软件,我们编写完源码后不⽤编译,直接运⾏源码即可。
常⽤的Shell:bash由 GNU 组织开发,sh 是 UNIX 上的标准 shell,是第⼀个流⾏的 Shell,bash保持了对 sh shell 的兼容性,是各种Linux 发⾏版默认配置的 shell。现在sh 已经基本被 bash 代替,bash是sh的扩展补充,但是也有些是不兼容的,⼤多数情况下区别不⼤,特殊场景可以使⽤ bash 代替 sh。
在ubuntu下,上图是我们打开的终端,这⾥输⼊的命令就是我们shell的命令,⼀般$表⽰的是普通⽤户,⽽#表⽰的是超级⽤户(root)
⽬录
1、第⼀个脚本程序:
在终端创建⼀个.sh⽂件,vi test.sh
第⼀⾏,#!是⼀个约定的标记,它告诉系统这个脚本需要什么解释器来执⾏,⽤的是哪种shell,后⾯的/bin/bash就是指明了解释器的具体位置。 第⼆⾏#是注释⾏,⽤来解释说明,当然#!是特殊的,不在此类。 第三⾏在是终端输出 hello,is me!
执⾏shell脚本:
./test.sh: ./表⽰当前⽬录,执⾏./test.sh会说明权限不够,不能执⾏。需要改变⽂件的权限:chmod 777 test.sh,就能执⾏
. ./test.sh: 在不想改变权限的时候,测试脚本是不是能够正常使⽤。. 临时增加权限。
2、shell获取字符串长度:
#!/bin/bash
#获取字符串长度
str="123456"
echo "${#str}"
结果:
3、shell变量:
在bash shell中,每⼀个变量的值都是字符串, 当然也可以⽤declare 关键字显式定义变量的类型,在赋值的时候等号两边不能有空格,如:str=1 ,str='1' ,str="1",变量名必须有字母、下划线、数字组成,开头必须字母或者下划线,不能⽤shell。
局部变量:shell也有⾃定义函数,函数⾥⾯的变量为局部变量,但是它也是相当于全局变量,函数中的变量,在函数外调⽤也是可以的,如果要仅限函数使⽤,需要在函数变量前加个关键字:local
全局变量:每打开⼀个终端就是⼀个shell会话,在这个shell会话(终端)定义的变量就是全局变量,它在这个shell会话有效,当你打开另⼀个终端就是另⼀个shell会话,这个变量在另⼀个终端就失效了。
环境变量:在全局变量前加 export ,如:export a=1 那么这个变量就是环境变量了。创建这个变量的shell成为⽗shell,这个shell 中,在创建⼀个shell叫做⼦shell,环境变量可以由⽗shell往下⼀级⼀级传,⽽不能逆转往上传递。当shell会话销毁时,这个环境变量也会随之销毁。想要永久保存就得环境变量写到启动⽂件中去。
4、引⽤shell变量:
使⽤shell变量在变量前⾯加⼀个$,⽽标准的是 &{},⽬的是在⼀长串字符中可以识别出这个变量,⽽不会引起误会,如下:
#!/bin/bash
#引⽤shell变量
str="abc"
echo "$str"
echo "the str vaile is: $str1"
#后⾯增加⼀个1,就不能正确的识别变量
echo "the str vaile is: ${str}1"
#所以我们引⽤变量,最好统⼀⽤ ${} 的形式
结果:
5、shell变量的赋值、修改、删除:
a)、shell变量的赋值:
#!/bin/bash
#变量的赋值
n=1
v1=${n}
v2='${n}'
v3="${n}"
echo "${v1}"
echo "${v2}"
echo "${v3}"
可以从结果看出不加引号和加双引号的结果是相同的,⽽单引号是原样输出变量后⾯赋值的内容。
b、shell变量的修改、删除:
#!/bin/bash
#变量值的修改
linux循环执行命令脚本a=1
echo "a: ${a}"
a=2
echo "a: ${a}"
#只读变量是不可以修改的,在变量前加readonly,就是只读变量
c=1
echo "c: ${c}"
readonly c
c=2
echo "c: ${c}"
#只要在变量前⾯加⼀个 unset,如: unset a 就可以删除变量。
unset a
echo "a: ${a}"
5、shell特殊变量:
$0当前脚本的⽂件名或者解释器。
$n(n≥1)传递给脚本或函数的参数。n 是⼀个数字,表⽰第⼏个参数。例如,第⼀个参数是 $1,第⼆个参数是 $2。
$#传递给脚本或函数的参数个数。
$*传递给脚本或函数的所有参数。
$@传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同,$*的所有参数是⼀个数据,⽽$@⼀个参数就是⼀份数据$?上个命令的退出状态,或函数的返回值
$$当前 Shell 进程 ID。对于 ,就是这些脚本所在的进程 ID。
脚本:如果参数个数太多,达到或者超过了 10 个,那么就得⽤${n}的形式来接收了,例如 ${10}、${11}
#!/bin/bash
#shell特殊变量
#$n: $0表⽰本脚本,$1表⽰输⼊的第⼀个参数:11,$2表⽰输⼊的第⼀个参数:22
echo "$ 0: $0"
echo "a: $1"
echo "b: $2"
#$*: 输⼊的参数 11 22
echo "$ *: $*"
#$@: 输⼊的参数 11 22
echo "$ @: $@"
#$$: shell进程id
echo "$ $: $$"
#$#: 参数个数 2
echo "$ #: $#"
函数:如果参数个数太多,达到或者超过了 10 个,那么就得⽤${n}的形式来接收了,例如 ${10}、${11}
#!/bin/bash
#shell特殊变量
#$n: $0表⽰本脚本,$1表⽰输⼊的第⼀个参数:11,$2表⽰输⼊的第⼀个参数:22
function temp(){
echo "$ 0: $0"
echo "a: $1"
echo "b: $2"
#$*: 输⼊的参数 11 22
echo "$ *: $*"
#$@: 输⼊的参数 11 22
echo "$ @: $@"
#$$: shell进程id
echo "$ $: $$"
#$#: 参数个数 2
echo "$ #: $#"
}
temp 11 12
$?:上⼀个命令的退出状态,或者返回值:
#!/bin/bash
if [ $1 == 11 ]
then
return 0
else
return 1
fi
$?在shell函数中的应⽤:
#!/bin/bash
function temp(){
return $1
}
temp 3
#$?: 这⾥是函数的返回值
echo "$ ?: $?"
6、shell中字符串的拼接:
#!/bin/bash
#shell字符串的拼接
n1=ab
n2=cd
temp1=${n1}${n2} #中间不能有空格
temp2="${n1}${n2}"
temp3="${n1}cdefg"
echo "${temp1}"
echo "${temp2}"
echo "${temp3}"
7、字符串的截取
${string: start :length}:字符串从左边start开始的位置截取length个字符,如果没有length,就从左边start开始到结束
${string: 0-start :length}:字符串从右边start开始的位置截取length个字符,如果没有length,就从右边数start开始到结束${string#*chars}:字符串从左边开始的第⼀个chars开始的位置截取到右边结束,chars本⾝不在截取范围内
${string##*chars}:字符串从左边开始的最后⼀个chars开始的位置截取到右边结束,chars本⾝不在截取范围内
${string%*chars}:字符串从右边边开始的第⼀个chars开始的位置截取到左边结束,chars本⾝不在截取范围内
${string%%*chars}:字符串从右边开始的最后⼀个chars开始的位置截取到左边结束,chars本⾝不在截取范围内
#!/bin/bash
#shell截取字符串
str=http//:baidu/.c
echo "length: ${str:7:5}" # baidu
echo "no length: ${str:7}" # baidu/.c
echo "length: ${str:0-7:5}" # /
echo "no length: ${str:0-7}" # /.c
echo "#: ${str#*/}" # /:baidu/.c
echo "##: ${str##*/}" # .c
echo "%: ${str%/*}" # http//:baidu
echo "%%: ${str%%/*}" # http
8、shell中的数组:
bash shell 中只⽀持⼀维,⽽不⽀持⼆维,定义的形式:array=(n1 n2 n3) ,数组名等号两边不能有空格,数组变量的值⽤空格隔开表⽰不同的值,⼀个数组变量的值可以⽤数字或者字符串不同的形式组成:array=(1 2 ab) 。
Shell 数组的长度不是固定的,定义之后还可以增加元素,如:array[3]=cd ;就在最后增加了⼀个元素。
也不⽤逐个赋值;如:array=([2]=ab);但他的长度是1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论