走进shell脚本

120 阅读2分钟

1 什么是shell ?

平时我们经常在 Linux 操作系统中使用各种命令,比如查看当前的目录文件,我们会使用 "ls" 或者 "ls -l",这些字符串参数实际上会被"shell"执行并启动。shell负责将用户输入的字符串转换为需要执行程序。即帮用户更方便使用操作系统接口的“壳”。

2 第一个shell之 hello word

2.1 创建文件: vi 创建并打开一个文件,hello.sh, 扩展名为.sh。

2.2 编辑内容:

#!/bin/bash
echo "Hello word !"

注:#!/bin/bash 告诉系统使用什么解析器,echo输出内容

2.3 执行

方法一: 赋予可执行权限 再执行

chmod +x ./hello.sh ./hello.sh

方法二: 调用/bin/sh终端执行

/bin/sh hello.sh

3 变量

3.1 注意事项

  • 变量名和等号之间不能有空格
  • 命名首个字符不能是数字,只能使用英文字母、数字和下划线
  • 不能使用标点符号
  • 不能使用bash中关键字

3.2 变量使用

使用变量(使用变量的过程中,最好加上花括号),只需要在变量前面加上美元符号即可

#!/bin/bash
val1="Hello word !"
echo ${val1}

3.3 只读变量

使用 readonly 定义变量即为只读,不能改变

#!/bin/bash
val1="Hello word !" readonly
echo ${val1}

3.4 变量删除

#!/bin/bash
val1="Hello word !"
unset val1
echo ${val1} #不会有输出

3.5 变量作用域

  • 局部变量:仅当前shell可用

  • 环境变量:所有程序都能访问环境变量

  • shell变量:通过一部分环境变量和shell 变量保证shell 的正常运行

3.6 变量类型

3.6.1 字符串

  • 使用字符串的过程中,既可以用双引号也可以用单引号,也可以不用
  • 单引号内容原样输出,不能包含变量,且不能出现单独单引号
  • 双引号可以出现转义字符
#!/bin/bash
name='zhagnsan'
str=" \"$name \" Hello word !"
echo -e ${str}

3.6.2 字符串长度

使用 # 获取字符串长度

#!/bin/bash
name='zhagnsan'
str=" \"$name \" Hello word !"
echo -e #{str}

3.6.3 数组

支持一维数组,读取数组,使用 @输出数组所有元素

#!/bin/bash
array=(value1,value2,value3)
#读取数组
echo ${array[0]}
#使用@输出数组所有元素
echo ${array[@]}

获取数组中所有元素以及数组长度

#!/bin/bash
array=(value1,value2,value3)
#读取数组
echo ${array[0]}
#使用@输出数组所有元素
echo ${array[@]}
#输出数组个数
echo ${#array[@]}

3.7 shell传递参数

在执行shell的时候,命令行指定参数,如: ./hello.sh 1 2

#!/bin/bash
name='zhagnsan'
str=" \"$name \" Hello word !"

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

@和*的区别 : ./demo.sh 1 2 3

相同点:都是会引用所有参数

不同点:在使用双引号的时候。如果脚本运行时两个参数为a,b,则"*"等价于"ab",而"@"等价于"a","b"

#!/bin/bash
name='zhagnsan'
str=" \"$name \" Hello word !"

for i in "$*";
do
echo $idone 

for i in "$@";
do
echo $idone 

3.8 printf

使用 printf 格式化字符串,同时可以指定字符串宽度和对齐方式,格式如下

4 test

shell 中的test用于检查某个条件是否成立

特殊字符含义:

  • ?# : 传递到脚本的参数个数
  • $* :以一个单字符显示所有向脚本传递的参数
  • ‘$$’:脚本运行的当前进程Id
  • ‘@:与@ :与@:与*相同,但是使用时候加引号,并在引号中返回每个参数
  • $- :显示shell使用的当前选项
  • $? :显示最后命令的退出状态,0表示没有错误,其他值都表示有错

test判断

  • -eq 等于
  • -ne 不等于
  • -gt大于
  • -lt 小于
  • -le 小于等于
#!/bin/bash
a=22
b=33
if test $[a] -eq $[b]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

5 if else-if else

#!/bin/bash
if  条件1
then
    任务1
elif 条件2
then
    任务2
else
    任务3
fi

6 for 循环

#!/bin/bash
for i in 1 2 3 4 5 6 7 8
do
echo "遍历:$i"
done

7 while 语句

通常用于从输入文件不断读取数据

用法:

while 条件
do
  任务
done

案例:

用法:
#!/bin/bash

i=1
while (($i<=10))
do
  echo $i
  let "i++" #用于执行一个或者多个
done

8 case 语句

多选择语句。取值后面为单词in,每一个模式以")"结束。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ";;"。

用法:
#!/bin/bash
echo "输入1到3之间的数据"
echo "你输入的数据为:"
read  num
case $num  in
   1) echo "你输入 1 "
   ;;
   2) echo "你输入 2 "
   ;;
   3) echo "你输入 3 "
   ;;
   *) echo "没有输入1到3的数字"
   ;; 
esac

9 跳出循环

break:命令允许跳出所有循环

continue:跳出当次循环

10 shell函数

用法:

[function] 方法名 [()]
{
   action;
   [return int ;]
}

案例:

#!/bin/bash
Fun1(){
echo "这是一个shell函数!"
}
echo "shell函数开始执行"
Fun1
echo "shell函数执行完成"