# 一、基础概念

  Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

  • 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,也就是 Bourne Again Shell,由于易用和免费,在日常工作中被广泛使用。同时,Bash 也是大多数 Linux 系统默认的 Shell。

  sh 脚本的第一行通常是

#!/bin/bash

   #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

  运行 Shell 脚本有两种方法:

  • 作为可执行程序
chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

  注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

  • 作为解释器参数
/bin/sh test.sh
/bin/php test.php

  这种方式运行的脚本,不需要在第一行指定解释器信息,写了也会被忽略。

# 二、Shell 变量

# 2.1 创建 Shell 变量

  在 Shell 编程中,变量是用于存储数据值的名称。定义变量时,变量名不加美元符号,如:

your_name="runoob"

  注意,与其他编程语言不同,变量名和等号之间不能有空格,因为空格通常用于分隔命令和参数。

  除了显式地直接赋值,还可以用语句给变量赋值,如:

for file in `ls /etc`
for file in $(ls /etc)
以上语句将 /etc 下目录的文件名循环出来。

# 2.2 使用 Shell 变量

  使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

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

  如果不给 skill 变量加花括号,写成 echo "I am good at $skillScript" ,解释器就会把 $skillScript 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。推荐给所有变量加上花括号,这是个好的编程习惯。

  已定义的变量,可以被重新定义,如:

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

# 2.3 只读变量

  使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。下面的例子尝试更改只读变量,结果报错:

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

运行脚本,结果如下:

line 4: myUrl: readonly variable

# 2.4 删除变量

  使用 unset 命令可以删除变量。变量被删除后不能再次使用。unset 命令不能删除只读变量。语法:

unset variable_name

# 2.5 变量类型

  Shell 支持不同类型的变量,其中一些主要的类型包括:

  • 字符串变量: 在 Shell 中,变量通常被视为字符串。你可以使用单引号 ’ 或双引号 " 来定义字符串,例如:
my_string='Hello, World!'
# 或者
my_string="Hello, World!"
  • 整数变量: 在一些 Shell 中,可以使用 declaretypeset 命令来声明整数变量。这样的变量只包含整数值,例如:
declare -i my_integer=42
  • 数组变量: Shell 也支持数组,允许在一个变量中存储多个值。数组可以是整数索引数组或关联数组,以下是一个简单的整数索引数组的例子:
# 整数索引数组
my_array=(1 2 3 4 5)
# 关联数组
declare -A associative_array
associative_array["name"]="John"
associative_array["age"]=30
  • 环境变量: 这些是由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境。例如,PATH 变量包含了操作系统搜索可执行文件的路径:
echo $PATH
  • 特殊变量: 有一些特殊变量在 Shell 中具有特殊含义,例如 $0 表示脚本的名称, $1 , $2 , 等表示脚本的参数, $# 表示传递给脚本的参数数量, $? 表示上一个命令的退出状态等。

# 2.5.1 Shell 字符串

  字符串是 shell 编程中最常用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。

# 单引号
your_name='runoob'
str='Hello, I know you are \"$your_name\"! \n'
echo -e $str
# 输出:Hello, I know you are \"$your_name\"!

  单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
# 双引号
your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
# 输出结果为:Hello, I know you are "runoob"!

  双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符
# 拼接字符串
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 输出结果为:hello, runoob ! hello, runoob !
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3
# 输出结果为:hello, runoob ! hello, ${your_name} !
# 获取字符串长度
string="abcd"
echo $
更新于 阅读次数