优秀的编程知识分享平台

网站首页 > 技术文章 正文

Linux Shell 入门实战之一

nanyue 2024-12-31 13:37:49 技术文章 7 ℃

引言

Shell 是一个命令行界面,它允许用户与操作系统进行交互。在 Linux 和 Unix 系统中,Shell 是最常用的用户界面之一。本手册旨在为初学者提供一个关于 Shell 的基本入门指南,帮助您理解 Shell 的基本概念和常用命令,并通过httpd搭建一个文件服务器来获取文件并执行一系列操作,希望对您有所帮助。

什么是 Shell

Shell 作为一个至关重要的程序,宛如一座沟通用户与操作系统的桥梁。它时刻准备着接收用户输入的各类命令,这些命令涵盖了各种复杂和多样化的需求。无论是简单的文件查看请求,还是复杂的系统配置更改指令,Shell 都会无一遗漏地接收,并迅速而精准地将其传递给操作系统去执行。同时,Shell 不仅仅是简单的命令传递者,它还肩负着对操作系统返回结果进行深入解释的重任。就如同一位经验丰富的翻译官,将操作系统返回的那些充满专业术语和代码的结果,转化为用户能够轻松理解和接受的清晰信息,并以直观明了的方式将其显示给用户。

Shell 的出现极大地改变了用户与计算机操作系统交互的方式。在早期计算机发展阶段,用户直接面对操作系统进行操作是极其复杂和困难的,而 Shell 的诞生为用户提供了一个相对友好和便捷的途径。Shell 所提供的用户友好界面,使得用户能够高效地执行一系列关键任务。比如在文件操作方面,用户可以通过输入特定的命令,实现文件的创建、删除、复制、移动等操作。以创建文件为例,用户只需输入相应的指令,Shell 就能立即将这一需求传达给操作系统并执行,为用户省去了繁琐的手动操作步骤。

在程序执行方面,Shell 允许用户启动各种应用程序,无论是办公软件、娱乐程序还是专业的开发工具。进程管理也是 Shell 的重要功能之一,用户能够通过它监控进程的状态,如查看进程是否在运行、占用资源的情况,甚至可以根据需要终止某些进程,从而确保系统的稳定和高效运行。

常见的 Shell 类型

  1. Bash (Bourne Again SHell):最流行的 Shell,是大多数 Linux 发行版默认的 Shell。
  2. Zsh (Z shell):一个功能强大的 Shell,它兼容 Bash 并且提供了许多增强功能。
  3. Csh (C Shell):以 C 语言语法为模型的 Shell。
  4. Tcsh (TENEX C Shell):Csh 的增强版。

基础知识

在命令行界面新建一个hello.sh(在终端输入touch hello.sh然后回车)的文件,扩展名为sh,代表shell,推荐使用vim 进行操作,例如这里我们要编辑 hello.sh 这个文件,那么我们需要在控制台中输入vim hello.sh 然后回车,这个时候我们还不能直接输入内容,需要先输入i或者a进入编辑模式,编辑完成后,按[ESC]退出编辑模式进入命令模式,在输入:wq!进行保存退出,关于VIM怎么使用,后面有专门的文章进行讲解,这里只是简单提一下。我们编辑完hello.sh后现在如何执行这个文件呢?有两种方式,第一种直接使用命令bash hello.sh 执行,第二种先给hello.sh文件赋予可执行权限然后再执行,赋权(chmod +x hello.sh), 执行(./hello.sh)。输入下面内容:

#!/bin/bash
echo "Hello, Shell"

变量

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

name="mona1isa"

注意,变量名和等号之间不能有空格,这和其他编程语言(如C,C++, Java, Python, Go等诸多语言)不一样,同时,变量名的命名须遵循如下规则:

  • 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
  • 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
  • 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、do、done、else、fi、for、while 等)作为变量名,以免引起混淆。
  • 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14
  • 避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
  • 避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。

PS: 有一些特殊变量在Shell中具有特殊含义,例如$0 表示脚本的名称,$1, $2, 等表示脚本的参数。$#表示传递给脚本的参数数量,$? 表示上一个命令的退出状态等。创建variables.sh,并输入以下内容,然后查看结果:

#!/bin/bash

echo "当前脚本名称为:$0"
echo "脚本第一个参数:$1"
echo "脚本第二个参数:$2"
echo "脚本所有参数个数:$#"

数组

在Shell数组中可以存放多个值,Bash Shell只支持一维数组这和C,Java,Python 等语言不一样,与其他语言类似的是数组下标都是从0开始的,Shell数组使用括号来表示,数组中的元素使用空格还分隔

#!/bin/bash

arr=(11 22 33 44 55 "aa" "bb" "cc")
echo "第一个元素为:${arr[0]}"
echo "第二个元素为:${arr[1]}"
echo "第三个元素为:${arr[2]}"
echo "第四个元素为:${arr[3]}"
echo "第五个元素为:${arr[4]}"
echo "第六个元素为:${arr[5]}"
echo "第七个元素为:${arr[6]}"
echo "第八个元素为:${arr[7]}"

运算符

Shell 提供了一系列基本的运算符,用于执行数学运算和字符串比较等操作。包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如比较常用的expr,它是一个表达式计算工具,使用它能完成表达式的求值操作。在逻辑运算中需要注意的是数字与中括号之间要有空格,以下是常见的算术运算和逻辑运算,创建alg.sh 文件,然后执行观察结果:

#!/bin/bash

# 加法计算
sum=$(expr 2 + 2)
echo "计算加法 2+2=$sum"

# 减法计算
sub=$(expr 4 - 2)
echo "计算减法 4-2=$sub"

# 乘法计算
mul=$(expr 2 \* 4)
echo "计算乘法 2*4=$mul"

# 除法计算
div=$(expr 8 / 4)
echo "计算除法 8/4=$div"

# 求模(取余)
mod=$(expr 12 % 3)
echo "计算求模 12%4=$mod"

# 指数计算,expr 不支持指数运算,需要使用 bc 命令
idx_a=$(echo "3^2" | bc)
idx_b=$((3**2))
echo "指数计算,3的2次方,方式一:$idx_a,方式二:$idx_b"

# 关系运算
num1=10
num2=20
result="$num1 与 $num2 相等吗?"
if [ "$num1" -eq "$num2" ]
then
  rs=相等
else
  rs=不相等
fi
echo $result $rs

# 不等于判断
na="$num1 不等于 $num2 吗?"
if [ "$num1" -ne "$num2" ]
then
  rs_ne=是
else
  rs_ne=否
fi
echo $na $rs_ne


# 大于判断
gs="$num1 大于 $num2 吗?"
if [ "$num1" -gt "$num2" ]
then
  rs_gt=大于
else
  rs_gt=不大于
fi
echo $gs $rs_gt

# 小于判断
la="$num1 小于 $num2 吗?"
if [ "$num1" -lt "$num2" ]
then
  rs_lt=小于
else
  rs_lt=不小于
fi
echo $la $rs_lt

# 逻辑运算(AND)
if [ 3 -lt 5 ] && [ 5 -gt 3 ]
then
  echo "3小于5 且 5大于3 为真"
else
  echo "3小于5 且 5大于3 为假"
fi

# 逻辑运算(OR)
if [ 3 -lt 5 ] || [ 5 -lt 3 ]
then
  echo "3小于5 或 5大于3 为真"
else
  echo "3小于5 或 5大于3 为假"
fi

# 逻辑运算(NOT)
if ! [ 3 -lt 5 ] 
then
  echo "3小于5取反为真"
else
  echo "3小于5取反为假"
fi

流程控制

Shell 脚本中的流程控制语句允许你控制脚本的执行流程,包括条件语句、循环语句等,条件语句就像是脚本运行道路上的智能岔路口。它根据特定的条件来决定脚本的走向。例如,当你需要判断某个文件是否存在时,条件语句会根据文件的实际存在情况,决定后续的操作是继续执行一系列相关命令,还是跳转去执行其他的替代操作。

循环语句则如同不知疲倦的工作机器,能够重复执行一段特定的代码块。以 for 循环为例,你可以设定它按照一定的范围或者条件进行重复操作。比如,逐个处理一个文件夹中的所有文件,对每一个文件执行相同的处理步骤,大大提高了工作效率。

条件语句(if-elif-else)

#!/bin/bash

val=10

if [ $val -eq 10 ]; then
  echo "Value is 10"
elif [ $val -lt 10 ]; then
  echo "Value is less than 10"
else
  echo "Value is greater than 10"
fi

# 上面的代码将输出 Value is 10

条件语句(case)

case 语句与其他语言像C, Java, Python 中的switch case 类似

#!/bin/bash

read -p "Enter a number between 1 and 3: " num

case $num in
  1) echo "You entered one." ;;
  2) echo "You entered two." ;;
  3) echo "You entered three." ;;
  *) echo "You did not enter a number between 1 and 3." ;;
esac

循环语句(for)

for 循环用于遍历一系列值

#!/bin/bash

for i in {1..5}
do
  echo "Iteration $i"
done

循环语句(while)

while 循环会持续执行,直到条件不再为真。

#!/bin/bash

i=0

while [ $i -lt 5 ]
do
  echo "Iteration $i"
  ((i++))
done

循环语句(until)

until 循环与 while 循环相反,它会持续执行,直到条件为真。

#!/bin/bash

i=0

until [ $i -ge 5 ]
do
  echo "Iteration $i"
  ((i++))
done

循环控制(break 和 continue)

break 和 continue 可以控制循环的执行。“break”和“continue”这两个关键字在编程中具有极其关键的作用,它们能够对循环的执行进行有效的控制。

“break”就如同一个紧急刹车装置,当在循环中遇到特定的条件时,它会立即终止整个循环的执行,使程序的流程瞬间跳出当前循环,不再继续后续的循环操作。比如说,在一个遍历数组的循环中,如果找到了满足特定条件的元素,使用“break”就可以立刻停止循环,避免不必要的计算和资源消耗。

“continue”则更像是一个临时的跳转指令,当遇到满足特定条件时,它会跳过当前这一轮循环的剩余部分,直接进入下一轮循环。以计算一个整数列表中所有奇数的和为例,当遇到偶数时,使用“continue”就可以跳过当前偶数,直接处理下一个数字,提高程序的执行效率。

#!/bin/bash

for i in {1..10}
do
  if [ $i -eq 6 ]; then
    break
  fi
  echo "Iteration $i"
done

echo "Loop ended."

for i in {1..10}
do
  if [ $i -eq 6 ]; then
    continue
  fi
  echo "Iteration $i"
done

在下一篇中,我们将会持续且深入地为各位朋友介绍 Shell 编程的后续关键内容。这些内容涵盖了诸多重要方面,其中包括功能强大且实用的函数,能够灵活改变数据流向的输入输出重定向,便捷高效的网络下载方式,对文件进行精细管理和操作的文件处理手段,以及在日常编程中经常使用的一系列命令。不仅如此,我们还会进一步向大家阐述如何运用 httpd 来成功搭建文件服务器。在搭建完成之后,我们还将详细讲解如何在这个文件服务器上进行各类文件处理操作。

从编程知识的体系构建角度来看,这些后续内容的介绍将极大地丰富和完善大家对于 Shell 编程的理解与应用能力。在当今数字化的时代背景下,掌握这些知识和技能,对于提升个人的工作效率以及解决实际问题的能力,都具有不可忽视的重要意义。相信通过下一篇的详细讲解,大家能够在 Shell 编程的道路上更进一步,更加熟练和自信地运用这些知识去应对各种复杂的编程任务和实际需求。

Tags:

最近发表
标签列表