Shell脚本学起来

2020/07/10

文章内的所有脚本均在linux环境下执行

1、第一个Shell脚本

[root@helloworld ~]# vim test.sh
#!/bin/bash
echo "Hello World !"

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。echo 命令用于向窗口输出文本。

运行脚本的两种方法

  • 作为可执行程序

    chmod +x ./test.sh  #使脚本具有执行权限
    ./test.sh  #执行脚本
    
  • 作为解释器参数

    /bin/sh test.sh
    /bin/php test.php
    

    注意:这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

2、Shell变量

定义变量

# 注意,变量名和等号之间不能有空格,
# 变量命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
# 1、显示赋值变量
your_name="runoob.com"
# 2、for语句给变量赋值
for file in `ls /etc`
或者
for file in $(ls /etc)

使用变量

your_name="qinjx"
echo $your_name  # 不加花括号
echo ${your_name} # 加花括号可以帮助解释器识别变量的边界
# 下面这种情况必须加花括号
for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

# 重新赋值
your_name="tom"
echo $your_name
your_name="alibaba"
# 注意,第二次赋值的时候不能写$your_name="alibaba",因为变量不能有特殊字符,$是使用变量

只读变量

#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"

执行脚本,修改只读变量报错

删除变量

# unset 删除变量,不能删除只读变量
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl # 变量已删除,没有输出

3、Shell字符串

# 可以单引号和双引号
str1='this is a string'
# 使用\进行转义字符
your_name='runoob'
str2="Hello, I know you are \"${your_name}\"! \n"
echo -e $str2

执行脚本

拼接字符串

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

输出结果:建议使用双引号拼接字符串

hello, runoob ! hello, runoob ! 
hello, runoob ! hello, ${your_name} !

字符串长度

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

提取子字符串

# 第 2 个字符开始截取 4 个字符,索引初始值为0
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
# 查找字符 i 或 o 的位置
echo `expr index "$string" io`  # 输出 4 发现位置是从1开始计算的, 注意 ` 是反引号,而不是单引号 '

4、Shell 数组

# 1、定义数组,格式:数组名=(值1 值2 ... 值n)
# 用括号来表示数组,数组元素用"空格"符号分割开
array_name=(value0 value1 value2 value3)
# 单独定义数组的各个分量
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

# 2、读取数组,格式:${数组名[下标]}
valuen=${array_name[n]}
# 使用 @ 符号获取数组中的所有元素,输出所有的元素
echo ${array_name[@]}

# 3、获取数组长度,与获取字符串长度的方法相同
length=${#array_name[@]}  # 区别,多了一个 # 号
length=${#array_name[*]}  # 使用 * 号也可以获取数组的长度
lengthn=${#array_name[n]} # 获取第n个元素的字符串长度

5、Shell 注释

使用 # 开头的行就是注释,如
#--------------------------------------------
# 这是一个注释
# author:菜鸟教程
# site:www.runoob.com
# slogan:学的不仅是技术,更是梦想!
#--------------------------------------------

多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF

6、Shell 传递参数

向脚本传递参数,格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

编写脚本 tesh.sh

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

执行脚本

$ ./test.sh 1 2 3

Post Directory