Shell学习

Shell脚本

是一种为shell编写的脚本程序

使用文本编辑器既能编写,拓展名不影响脚本执行

实例:

#!/bin/bash
echo "Hello World"

#!告诉系统这个脚本需要什么解释器执行

运行脚本

作为可执行程序

将代码保存后,给文件添加可执行权限+x

chmod +x ./test.sh #
./test.sh #执行脚本

作为解释器参数

直接运行解释器,将文件作为其参数 这种方式不需要在文件开头指定解释器信息

/bin/sh test.sh

Shell变量

定义变量

your_name="Tom"

**注意:**等号不能有空格

使用变量

在变量前加美元符号$ 还可在变量外添加大括号{}

echo $your_name
echo ${your_name}

只读变量

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

url="baidu.com"
readonly url

删除变量

使用unset变量删除变量

unset url

Shell字符串

可用单引号,或双引号,也可不用引号

单引号

  • 单引号内任何字符都会原样输出,单引号字符串中变量无效
  • 单引号字符串中不能出现单独一个的单引号,但可成对出现

双引号

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

拼接字符串

text1='123'
text2='456'
echo ${text1}${text2}
#输出123456

字符串长度

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

提取子字符串

从字符串第2个字符开始截取4个字符:

str2="hello world"
echo ${str2:1:4} #输出ello

查找子字符串

查找字符ao的位置(哪个字母先出现就计算哪个)

str3="how are you"
echo `expr index "$str3" ao` #输出2

Shell数组

只支持一维数组

定义数组

my_arr1=(1 2 'A' "BC")
my_arr2=(
	1
	'a'
	"cc"
	)

读取数组

使用@符号获取数组中所有元素

echo ${my_arr1[@]}
#输出1 2 A BC

数组长度

length=${#my_arr1[@]}
length=${#my_arr2[*]}

Shell传参

执行脚本时,向脚本传递参数,脚本内获取参数的格式为:$n,n代表数字,代表执行脚本的第n个参数,$0为执行的文件名

实例

定义文件:

#!/bin/bash

echo "执行的文件名: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"

执行脚本:

$ chmod +x text.sh
$ ./test.sh 1 A
执行的文件名: ./test.sh
第一个参数: 1
第二个参数: A

特殊参数

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

Shell基本运算符

原生bah不支持简单的数学运算,但可以使用awk或expr实现,expr最常用。

expr是一款表达式计算工具,使用它能完成表达式的求值操作

两数相加:

#!/bin/bash
val=`expr 2 + 2`
echo "2 + 2 = $val"

注意:

  • 表达式和运算符之间要有空格
  • 完整表达式要被` `包含

关系运算符

  • -eq 是否相等
  • -ne 是否不等
  • -gt 左边是否大于右边
  • lt 左边是否小于右边
  • -ge 左边是否大于等于右边
  • -le 左边是否小于等于右边

布尔运算符

  • ! 非
  • -o 或
  • -a 与

文件测试运算符

  • -b file 是否是块设备文件
  • -c file 是否是字符设备文件
  • -d file 是否是目录
  • -f file 是否是普通文件
  • -g file 是否设置了SGID位
  • -k file 是否设置了粘着位
  • -r file 是否可读
  • -w file 是否可写
  • -x file 是否可执行
  • -s file 是否为空
  • -e file 是否存在
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus