sh脚本学习

Last updated on a day ago

什么是 sh 脚本

sh 脚本就是 Shell,简单来说可以自动进行命令行的操作

环境配置

只需要有文本编辑器和解释器就可以了,linux 常见的有
Bourne Shell(/usr/bin/sh 或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh
这里讲的是 Bash

helloworld

1
2
3
#!/bin/bash
# 输出hello world
echo "hello world"

#!标记会告诉系统使用什么解释器来执行
#表示注释,后面的内容都会被解释器忽略
echo "hello world"表示输出文本

执行脚本

首先需要让文件有被执行的权限,在命令行输入以下命令

1
chmodd +x ./hello.sh

然后就可以执行脚本了

1
./hello.sh

如果想指定解释器,还可以将脚本作为解释器参数

1
2
/bin/sh hello.sh
/bin/php hello.php

这种写法会忽略第一行的解释器指定

变量

声明变量

shell 声明变量类似 python,直接变量名+赋值就好了

1
hello="world"

注意,等号前后不能有空格,等号两侧出现空格可能会导致错误

使用变量

在使用变量时,只需在变量名前加$就可以了

1
2
3
hello="world"
echo $hello
echo ${$hello}

如上,其中{}花括号用于帮助解释器识别变量的边界,比如下面这种写法

1
2
3
hello="world"
echo "$hellohello"
echo "${hello}hello"

$hellohello会被认为是使用了一个名为hellohello的变量(其值为空),${hello}hello则会打印出“worldhello”

只读变量

可以使用readonly命令将变量定义为只读,其值不能被改变
使用时慎重,这个操作不可逆

1
2
3
4
5
6
# 声明变量
myName="lihua"
# 定义为只读变量
readonly myName
# 尝试修改只读变量的值发生报错
myName=:"xiaoming"

也可以在声明的时候定义

1
2
readonly myName="lihua"
myName="xiaoming"

删除变量

使用unset命令可以删除变量,但不能删除只读变量

1
unset myName

变量类型

和其他语言一样,shell 也有变量类型

  • 字符串类型
    默认情况下,变量通常被视为字符串,比如
1
2
3
4
#!/bin/bash
a=1
b=$a+1
echo $b

上面的代码虽然看着是赋值了一个整形,但其实是会作为字符串解释的,所以 b 的值是“1+1”
也可以使用单引号或双引号定义字符串

  • 整数
    可以使用declaretypeset(在 bash 中typesetdeclare的别名,用法一致)命令来定义整数变量,但这是不一定的,有些 shell 并不是用这两个命令,所以开头指定解释器很重要
1
2
3
#!/bin/bash
declare -i num1=100
typeset -i num2=200
  • 数组
    数组可以分为索引数组关联数组,其实两者的区别只是键值对的区别而已,索引数组使用下标作为键,关联数组使用字符串作为键
1
2
3
4
5
6
7
8
# 定义索引数组
my_array=(1 2 3 4 5)
# 使用declare或typeset定义索引数组
typeset -a my_array2=(1 2 3 4 5)
# 使用declare或typeset定义关联数组
typeset -A my_array3=([key]=value)
my_array3["name"]="lihua"
my_array3["age"]=20

想要调用数组需要用{}将变量名+索引括起来

1
2
echo ${my_array[0]}
echo ${my_array3["name"]}

还可以使用!*,获取索引或所有值

1
2
3
4
5
6
# 使用*或@获取所有值
echo ${my_arrar3[*]}
echo ${my_arrar3[@]}
# 获取索引
echo ${!my_arrar3[*]}
echo ${!my_arrar3[@]}
  • 环境变量
    环境变量由用户或系统设置的特殊变量,比如PATH
1
echo $PATH

可以使用 export 查看环境变量,会有类似下面的返回值

1
2
declare -x USER="ww"
declare -x PWD="/home/ww"

-x表示变量为环境变量

1
2
echo $USER
# 返回"ww"
  • 特殊变量
    有一些特殊变量在 Shell 具有特殊含义,例如$0表示脚本的名称,$1, $2, 等表示脚本的参数。

$#表示传递给脚本的参数数量,$?表示上一个命令的退出状态等。

Shell 字符串

单双引号区别

单引号和双引号都可以用来表示字符串(甚至可以不用引号),但两者还是有些区别

  • 单引号
    • 无视变量,所有内容都会原样输出
    • 单引号字符串中不能出现单独一个单引号(用转义符也不行),但可以成对出现,作为
1
2
echo '$name\n'123''
#输出 $name123
  • 双引号
    • 双引号内可以有变量
    • 双引号内可以有转义字符
1
2
3
4
5
6
name="lihua"
# -e开启转义
echo -e "my name is \n \"${name}\""
#输出
#my name is
# "lihua"

字符串长度

1
2
3
str="abcd"
echo ${#str}
# 输出4

#用于获取元素的长度,可以指定索引。对于字符串而言str就是str[0],可以`$