实用shell基础教程--大量实例,助你面试通关和胜任工作

在这里插入图片描述

什么是shell,能做什么

Shell(壳)是计算机操作系统中的一个命令解释器,负责解释用户输入的命令并执行相应的操作。它是用户与操作系统内核之间的接口,提供了一种通过命令行或脚本的方式与计算机进行交互的途径。

Shell 可以执行以下一些任务:

  • 文件操作: 创建、复制、移动、删除文件和目录。
  • 进程控制: 启动、停止、管理进程。
  • 用户和权限管理: 创建、删除用户,设置文件和目录的权限。
  • 环境变量控制: 设置、查看环境变量。
  • 文本处理: 可以使用各种命令和工具对文本进行处理,例如搜索、替换、排序等。
  • 系统信息查看: 查看系统状态、硬件信息等。

以下是一些 Shell 命令的示例:

文件操作:

  • ls:列出当前目录的文件和子目录。
  • cp:复制文件或目录。
  • mv:移动或重命名文件或目录。
  • rm:删除文件或目录。
ls
cp file1.txt newfile.txt
mv oldfile.txt newlocation/
rm unwantedfile.txt

进程控制:

  • ps:显示当前运行的进程。
  • kill:终止一个正在运行的进程。
    *bash
ps aux
kill -9 PID

用户和权限管理:

  • useradd:创建新用户。
  • passwd:更改用户密码。
  • chmod:更改文件或目录权限。
useradd newuser
passwd newuser
chmod 755 myfile.txt

环境变量控制:

  • export:设置环境变量。
export PATH=$PATH:/new/directory

文本处理:

  • grep:在文件中搜索特定模式。
  • sed:进行文本替换。
grep "pattern" myfile.txt
sed 's/old/new/' myfile.txt

系统信息查看:

  • uname:显示系统信息。
  • df:显示磁盘空间使用情况。
uname -a
df -h

这些是基本的 Shell 命令,实际上有很多其他命令和选项,可以根据具体需要学习和使用。 Shell 脚本也是一种利用 Shell 命令编写的脚本,可以执行一系列的任务。

shell的种类

在Unix和Linux系统上,有许多不同的Shell,包括一些可能看起来过时但仍然存在的。以下是一些常见的Shell,包括一些可能相对较老的选择:

  • Bash(Bourne Again SHell): 是Unix和Linux系统上最常用的Shell,具有强大的脚本编程和命令行交互功能。
  • Zsh(Z Shell): 一个功能丰富的Shell,提供高级特性如智能提示、自动完成、插件支持等。
  • Fish(Friendly Interactive SHell): 注重用户友好性,具有语法高亮、智能提示等特性。
  • Ksh(Korn Shell): 由David Korn开发,融合了Bourne Shell和C Shell的特性,是一种强大的Shell。
  • Dash: Debian Almquist Shell,是一个轻量级的Shell,用于一些Unix系统中的系统脚本。
  • Ash: Almquist Shell,与Dash类似,是一个轻量级的Shell,通常用于嵌入式系统。
  • Csh(C Shell): 是Unix系统上较早的Shell之一,由比尔·乔伊(Bill Joy)开发,支持命令别名和历史命令浏览。
  • Tcsh(Tenex C Shell): 是C Shell的改进版本,添加了一些新特性,如命令补全、编辑模式等。
  • Sh(Bourne Shell): 是Unix系统上的原始Shell,为后来的Shell提供了基础。Bash、Dash等都是Bourne Shell的变种或替代。

虽然一些Shell在实际使用中可能相对较少,但它们仍然存在并可能在特定环境中发挥作用。在一些嵌入式系统、特殊环境或旧系统中,可能会看到使用较早的Shell的情况。
我们在实际工作、开发最常用的就是zsh和bash shell了。

shell的关键字

Shell中的关键字是一些具有特殊含义的保留字,它们用于控制程序流程、定义函数、进行条件判断等。以下是一些常见的Unix/Linux Shell关键字,附带了简单的例子:

  1. if: 用于执行条件判断。
if [ condition ]; then
    # commands to be executed if condition is true
else
    # commands to be executed if condition is false
fi
  1. else: 在if语句中,表示条件为假时执行的命令块。
if [ condition ]; then
    # commands for true condition
else
    # commands for false condition
fi
  1. elif: 在if语句中,表示多个条件的判断。
if [ condition1 ]; then
    # commands for condition1
elif [ condition2 ]; then
    # commands for condition2
else
    # commands if none of the conditions are true
fi
  1. while: 用于创建循环,当条件为真时重复执行一组命令。
while [ condition ]; do
    # commands to be executed as long as the condition is true
done
  1. for: 用于创建循环,迭代处理一组元素。
for variable in element1 element2 element3; do
    # commands to be executed for each element
done
  1. case: 用于多条件的分支选择。
case $variable in
    pattern1)
        # commands for pattern1
        ;;
    pattern2)
        # commands for pattern2
        ;;
    *)
        # default commands if no pattern matches
        ;;
esac
  1. function(或用关键字: declare): 用于定义函数。
function_name() {
    # function body
    # commands to be executed
}
  1. return: 用于从函数中返回值。
function_name() {
    # commands
    return 5
}

这些关键字在Shell脚本中用于控制流程、定义函数、进行循环等操作,它们是构建复杂脚本和程序的基础。

shell的基础语法

在Shell脚本中,可以定义和调用函数,传递参数,处理变量,控制流程,以及执行系统命令。

函数定义及调用

在Shell中定义函数的基本语法如下:

function_name() {
    # commands
}

调用函数时,只需使用函数名,后面带上参数(如果有的话)。

示例:

#!/bin/bash

# 函数定义
say_hello() {
    echo "Hello, $1!"
}

# 调用函数,并传递参数
say_hello "World"

参数数量及参数的引用

在Shell脚本中,$# 用来获取传递给脚本的参数数量,$1, $2, …, 9 用来引用第 1 到第 9 个参数, 9 用来引用第1到第9个参数, 9用来引用第1到第9个参数,{10}, ${11}, … 用来引用第10个参数以及之后的参数。

示例:

#!/bin/bash

# 显示传入的参数数量
echo "There are $# arguments passed to the script."

# 显示所有传入的参数
echo "The arguments are: $@"

# 单独显示每个参数
echo "First argument: $1"
echo "Second argument: $2"
# ... 以此类推

控制流程

Shell脚本提供了多种控制流程的语句,如:if 条件判断、for 和 while 循环等。

if语句示例:

#!/bin/bash

read -p "Enter a number: " num

if [ $num -gt 10 ]; then
    echo "The number is greater than 10."
elif [ $num -eq 10 ]; then
    echo "The number is equal to 10."
else
    echo "The number is less than 10."
fi

for循环示例:

#!/bin/bash

for i in {1..5}; do
    echo "Looping ... number $i"
done

while循环示例:

#!/bin/bash

counter=1
while [ $counter -le 5 ]; do
    echo "Counter is at $counter"
    ((counter++))
done

系统命令执行

在Shell脚本中,可以直接执行系统命令,也可以将命令的输出存储到变量中。

示例:

#!/bin/bash

# 直接执行系统命令
ls -l

# 将命令输出赋值给变量
output=$(ls -l)
echo "The listing of the current directory is:"
echo "$output"

管道和重定向

使用管道 (|) 和重定向 (>, >>, <) 可以控制命令的输入和输出。

管道示例:

#!/bin/bash

# 将 echo 的输出传递给 grep 命令
echo "This is a test" | grep "test"

重定向示例:

#!/bin/bash

# 将 echo 的输出重定向到文件
echo "This is a test" > test.txt

# 附加内容到文件
echo "Append this line to the file." >> test.txt

# 从文件中读取输入
grep "test" < test.txt

错误处理

使用 set 命令和 trap 可以实现错误处理。

set命令示例:

#!/bin/bash

set -e # 脚本遇到错误时立即退出

# 如果命令不存在或出现错误,脚本将停止执行
non_existing_command

trap命令示例:

#!/bin/bash

# 定义一个函数来处理错误
error_handler() {
    echo "An error occurred at line $1."
    exit 1
}

# 当脚本出现错误时调用 error_handler 函数
trap 'error_handler $LINENO' ERR

non_existing_command

变量的处理

在Unix/Linux中,与变量相关的操作包括变量的赋值、引用、修改、删除等。以下是一些与变量相关的操作:

  1. 变量赋值:
variable_name="Hello, World!"
  1. 变量引用:
echo $variable_name
  1. 字符串拼接:
greeting="Hello"
name="John"
sentence="$greeting, $name!"
echo $sentence
  1. 变量修改:
counter=5
((counter++))
echo $counter
  1. 命令替换:
current_date=$(date)
echo "Current date: $current_date"
  1. 删除变量:
unset variable_name
  1. 特殊变量:
echo "Script name: $0"
echo "First argument: $1"
echo "All arguments: $@"
  1. 数组操作:
fruits=("Apple" "Banana" "Orange")
echo "First fruit: ${fruits[0]}"
  1. 获取字符串长度:
string="Hello"
length=${#string}
echo "Length of the string: $length"
  1. 在字符串中查找子串:
full_string="Hello, World!"
substring="World"
if [[ $full_string == *$substring* ]]; then
    echo "Substring found!"
fi

这些操作涉及到变量的创建、引用、修改、删除、数组操作等,是Shell脚本中常见的操作。

字符串的操作

在Unix/Linux Shell中,有各种用于处理字符串的操作,包括字符串拼接、截取、查找、替换等。以下是一些常见的字符串操作示例:

  1. 字符串拼接:
first_name="John"
last_name="Doe"
full_name="$first_name $last_name"
echo $full_name
  1. 字符串长度:
my_string="Hello, World!"
length=${#my_string}
echo "Length of the string: $length"
  1. 字符串截取:
my_string="Hello, World!"
substring=${my_string:0:5}
echo "Substring: $substring"
  1. 查找子串:
my_string="Hello, World!"
if [[ $my_string == *World* ]]; then
    echo "Substring found!"
fi
  1. 替换子串:
my_string="Hello, Universe!"
new_string=${my_string/Universe/World}
echo "New string: $new_string"

`字符、'和"的用途和区别

在Unix/Linux Shell中,单引号(')、双引号(")和反引号(`)具有不同的用途。

  1. 单引号('):

用途:在单引号中的文本被视为纯字符串,其中的特殊字符和变量都不会被展开。
示例:

echo 'This is a single-quoted string'
echo 'Variable $name will not be expanded'
  1. 双引号("):

用途:在双引号中,可以展开变量和执行命令替换,但特殊字符仍然会被保留。
示例:

name="John"
echo "Hello, $name!"
echo "Today is $(date)"
  1. 反引号(`):

用途:反引号用于执行命令替换,将反引号内的命令执行结果嵌入到整个命令中。
示例:

current_directory=`pwd`
echo "Current directory: $current_directory"

总体而言,这些引号的选择取决于需要在字符串中使用变量或执行命令替换的情况。如果不需要展开变量或执行命令替换,单引号是一个简单的选择。双引号用于需要展开变量或执行命令替换的情况。反引号则专门用于执行命令替换。在一些情况下,也可以使用 $() 替代反引号,以提高可读性和避免一些潜在的问题。

here document

Here Document 是在Unix/Linux Shell脚本中用来提供多行输入的一种方便的方法。它允许你在脚本中嵌入大块的文本数据而无需使用引号包裹。Here Document 使用 << 后跟一个标识符来开始,文本块从下一行开始,并以标识符结束。标识符可以是任意选择的字符串,但通常使用 EOF 或其他不太可能在文本中出现的字符串。

Here Document 的语法如下:

bash
Copy code
command << delimiter
  text
delimiter

下面是一个具体的例子,演示了如何在Shell脚本中使用 Here Document:

#!/bin/bash

cat << EOF
This is a multiline text block.
It can contain multiple lines without the need for quotes.
Variables and commands will be expanded unless you use single quotes around the delimiter.
EOF

在这个例子中,cat << EOF 命令表示开始一个 Here Document,文本块从下一行开始,直到遇到 EOF 为止。在 EOF 之间的所有文本都被当作输入传递给 cat 命令。

Here Document 在脚本中的应用场景包括创建配置文件、生成动态文本等,它提供了一种方便的方式来处理多行文本数据。

shell运算

在Unix/Linux Shell中,可以进行各种数值运算和逻辑运算。以下是一些常见的运算示例:

  1. 算术运算:
# 使用$((...))进行算术运算
result=$((5 + 3))
echo "Result of addition: $result"
  1. 或者使用let关键字
let "result = 5 * 3"
echo "Result of multiplication: $result"
  1. 浮点数运算:
# 使用bc命令进行浮点数运算
result=$(echo "scale=2; 5.5 / 2" | bc)
echo "Result of division: $result"
  1. 比较运算:
a=5
b=10

if [ $a -eq $b ]; then
    echo "a is equal to b"
elif [ $a -lt $b ]; then
    echo "a is less than b"
else
    echo "a is greater than b"
fi
  1. 逻辑运算:
# 使用逻辑运算符 && 和 ||
age=25

if [ $age -ge 18 ] && [ $age -le 30 ]; then
    echo "You are between 18 and 30 years old."
else
    echo "You are not in the specified age range."
fi
  1. 位运算:
# 使用位运算符 &、|、^

x=5
y=3

result=$((x & y))
echo "Bitwise AND: $result"

result=$((x | y))
echo "Bitwise OR: $result"

result=$((x ^ y))
echo "Bitwise XOR: $result"

这些示例涵盖了在Unix/Linux Shell中进行各种数值运算和逻辑运算的方法。使用这些运算符,可以在脚本中进行简单到复杂的数学和逻辑操作。

IO操作

在Unix/Linux中,I/O(输入/输出)操作是非常重要的,涵盖了文件读写、标准输入输出、重定向等方面。以下是一些常见的 I/O 操作的例子:

  1. 文件读取:
# 读取文件内容并输出到屏幕
cat filename.txt
  1. 使用while循环逐行读取文件内容
while read line; do
    echo $line
done < filename.txt
  1. 文件写入:
# 将文本写入文件
echo "Hello, World!" > output.txt
  1. 追加文本到文件
echo "Additional content" >> output.txt
  1. 使用重定向:
# 将命令的输出重定向到文件
ls -l > file_list.txt

  1. 将文件内容作为命令的输入
cat file_input.txt | grep "pattern"
  1. 使用管道:
# 管道连接两个命令,将第一个命令的输出作为第二个命令的输入
ls -l | grep "file"
  1. 标准输入输出:
# 从键盘读取用户输入
echo "Enter your name:"
read name
echo "Hello, $name!"
  1. 输出到标准错误
echo "Error: Something went wrong!" >&2
  1. 使用 Here Document 进行输入:
    不再赘述

  2. /dev/null:

# 将输出重定向到 /dev/null,相当于丢弃输出
command > /dev/null

这些例子展示了Unix/Linux中的一些常见I/O操作,包括文件读写、标准输入输出、重定向、管道和 Here Document。这些操作使得在Shell脚本中能够方便地处理输入和输出。

sed(Stream Editor)

sed 是一个流式文本编辑器,用于对文本数据进行处理和转换。它通常用于对文件内容进行替换、删除、插入等操作。以下是sed的一些常见用法和例子:

sed的基本语法:

sed OPTIONS 'COMMAND' FILE
  • OPTIONS: 可以是一些选项,例如 -e 表示后面是sed的命令。
  • ‘COMMAND’: sed命令,用于指定要对文本执行的操作。
  • FILE: 要处理的文件。

例子:

  1. 替换文本:
# 将文件中的 "apple" 替换为 "orange"
sed 's/apple/orange/' input.txt
  1. 替换并保存到新文件:
# 将文件中的 "apple" 替换为 "orange",并将结果保存到新文件
sed 's/apple/orange/' input.txt > output.txt
  1. 多个替换:
# 同时替换文件中的 "apple" 和 "banana"
sed 's/apple/orange/; s/banana/pear/' input.txt
  1. 全局替换:
# 对每一行进行全局替换,而不仅仅是第一次出现的替换
sed 's/apple/orange/g' input.txt
  1. 删除行:
# 删除包含特定字符串的行
sed '/pattern/d' input.txt
  1. 插入行:
# 在匹配行后插入新行
sed '/pattern/a\
This is a new line' input.txt
  1. 替换并保存到原文件:
# 使用 `-i` 选项直接在原文件上进行替换
sed -i 's/apple/orange/' input.txt
  1. 在行首添加行号:
# 在每一行前添加行号
sed = input.txt | sed 'N; s/\n/\t/'

这些是一些基本的sed用法,能够满足许多文本处理的需求。sed的功能非常强大,可以通过学习更多的命令和选项来适应更复杂的文本编辑任务。

awk

awk 是一种强大的文本分析工具,通常用于模式扫描和处理。它被广泛应用于 Unix 和类 Unix 系统中,用于复杂的文本处理任务。awk 使用一种编程语言,支持变量、数值和字符串函数、逻辑运算符以及循环和条件语句等。

Awk 的基本用法

awk 的基本语法如下:

awk 'pattern {action}' file
  • pattern:指定一个模式,通常是一个正则表达式,用于匹配输入文本中的行。
  • action:一组在模式匹配的行上执行的命令或操作,包裹在大括号 {} 中。
  • file:输入文件的名称。
    如果省略 pattern,则 action 会应用于所有行。如果省略 action,awk 默认打印所有匹配 pattern 的行。

内置变量

awk 提供了一些内置变量来处理文本数据:

  • $0:当前记录(通常是整行文本)。
  • $1, 2 , . . . , 2,..., 2...n:当前记录的第 n 个字段。
  • NR:到目前为止读取的记录数量。
  • NF:当前记录中的字段数。
  • FS:字段分隔符,默认是空白字符。

Awk 示例

  1. 打印文件的每一行:
awk '{ print $0 }' filename.txt
  1. 打印文件每一行的第一个字段:
awk '{ print $1 }' filename.txt
  1. 使用逗号作为字段分隔符,打印每一行的第二个字段:
awk -F, '{ print $2 }' filename.txt
  1. 打印所有包含模式 pattern 的行:
awk '/pattern/ { print $0 }' filename.txt
  1. 打印文件中每一行的字段数和该行内容:
awk '{ print NF, $0 }' filename.txt
  1. 打印文件的第3行:
awk 'NR == 3 { print $0 }' filename.txt
  1. 对每一行的第一个和第二个字段求和:
awk '{ sum = $1 + $2; print sum }' filename.txt
  1. 打印每一行第一个字段的长度:
awk '{ print length($1) }' filename.txt
  1. 使用条件语句,根据第一个字段的值打印不同的内容:
awk '{ if ($1 > 100) print "Large"; else print "Small" }' filename.txt
  1. 打印每一行的字段数和所有字段值:
awk '{ print "Number of fields: " NF; for (i = 1; i <= NF; i++) print "Field " i " is " $i }' filename.txt

Awk 在命令行中的组合运用

在命令行中,awk 通常与其他文本处理工具如 grep、sort、cut 等结合使用,来解决更复杂的任务。

示例:结合 grep 和 sort 使用 awk:

grep "pattern" filename.txt | awk '{ print $2, $1 }' | sort

这个命令序列会先使用 grep 查找包含 pattern 的行,然后使用 awk 交换每一行的第一个和第二个字段的位置,最后将结果排序输出。

参考文档

求评论、求关注、求点赞

本文上万字,能看到这里,相信您一定仔细阅读了文章,如觉得本文对您有帮助,请多多评论、关注和点赞。

  • 33
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

namedlock

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值