shell脚本编辑
具体了解推荐:Linux实操篇——shell入门
shell:
- 概念:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。
- 性质:一个命令行解释器,解释由用户输入的命令并把它们送到内核去执行。
- 作用:用户与内核进行交互的接口,负责接收用户输入的命令并送入内核执行
shell脚本:
- 概念:用于编写自动化任务、批处理脚本和系统管理脚本的脚本语言
- 性质:利用Shell的功能所写的程序,写入到一个纯文本文件中。
- 作用:自动化执行一系列命令,减少手动操作的工作量,提高工作效率。
shell命令:
Shell常见命令涵盖了文件目录操作、系统状态查看、网络配置与诊断、文件压缩与解压缩等多个方面。
文件目录类
ls
列出目录内容
ls -l :显示详细的文件信息
ls -a :显示隐藏文件
ls -lS :以人类可读格式显示文件大小
ls -lh :按文件大小排序
cd
切换目录
cd :切换到当前用户的home目录
cd /path/bbb :切换到指定目录。
cd .. :返回上一级目录。
popd :返回到前一个工作目录
pwd
显示当前目录路径。
pwd :会显示当前工作目录
mkdir
创建目录。
mkdir AAA :创建目录AAA
mkdir AAA BBB CCC :创建多个目录,只有某些shell里面有
mkdir -p A/B/C :创建三层目录A/B/C
cp
复制文件或目录
cp A B :A被复制到B(B存在则覆盖,不存在则创建)
cp A B KKK/:A B复制到KKK目录下面
cp -r A B/ :复制A到B(B必须存在)
rm
删除文件或目录
rm A :删除名为A的文件
rm A B C :删除多个文件
rm -r KKK :删除目录及其内容(一般是-rf,不用确认)
cat
查看文件内容
cat A :查看文件内容(-n对每一行输出加上行号,-s不显示多余空白行)
cat A B>C :合并A、B到C里去
cat A>>B :向B里面追加A的内容
more
, less
分页查看文件内容
more -5 A :显示A的前五行(内容超过终端大小的时候,按空格键翻页)
less -N A :显示A,并添加行号(在less中使用/A 来搜索A)
head
,tail
查看文件的开头或结尾部分内容
head A :显示A前10行(-n 20显示前20行 -c 20显示前20个字节)
tail A :显示A后10行(-n 20显示后20行 -f 实时跟踪文件更新内容)
find
搜索文件
find [路径][选项][表达式][操作]
find /A/b -name"*.log" -ls :查找?、/A/b 目录先所有.log文件,并ls出来
ln
创建链接
ln [选项] 源文件 目标文件或者目录
ln A B :B是A的一个硬链接(-s就是软连接)
du
显示目录所占用的磁盘空间
du [选项][文件或者目录]
du -h :显示当前目录及其子目录的磁盘使用情况(人类可读)
du -sh /A/B :显示/A/B目录的磁盘使用情况
文件压缩和归档
tar
打包与压缩文件
tar [选项] 归档文件 目标
tar -czvf A.tar.gz AAA/ :创建一个gzip压缩的tar归档文件
tar -xzvf A.tar.gz :从gzip压缩的tar归档文件中提取内容
gzip
,gunzip
压缩和解压.gz文件
gzip A :把A压缩成A.gz(-k 保留源文件,否则不保留)
gzip -r A/ :压缩A目录中所有文件
gunzip A.gz :把A.gz解压缩到A(-k保留源文件,否则不保留)
gunzip -c A.gz>A :这会将 A.gz 解压缩后的数据写入 A,而不会删除或覆盖任何文件。
系统状态类
top
监控系统资源利用情况
top :内容多,系统时间、运行时间、登录用户数、系统负载:进程列表:内存和交换空间信息:
man top :获取更详细的信息和用法说明。
df
显示磁盘空间使用情况
df :文件系统:1K-块:已用:可用:已用%:挂载点:
man df :了解更多用法说明
uptime
显示系统运行时间和负载
uptime :当前时间 up 系统运行时间, 用户数, load average: 最近1分钟, 最近5分钟, 最近15分钟
who
,w
显示当前登录在系统上的用户信息
who :显示用户名、登录终端、登录时间以及从哪个主机登录(如果适用)
w :提供了更详细的信息
网络类
ping
检查网络连通性
ping <hostname-or-ip-address> :一个地址
ifconfig
配置网络接口参数
ifconfig:将显示系统上所有活动网络接口的信息,包括IP地址、子网掩码、广播地址、MAC地址等。
netstat
显示网络连接、路由表、网卡统计数信息
netstat :是一个命令行工具,用于显示网络连接、路由表、接口统计等网络相关信息。
traceroute
追踪网络数据包传输路径
是一个网络诊断工具,用于跟踪和显示数据包从源主机到目标主机所经过的每一跳(路由器)的路径。
其他
man
,info
查看命令的帮助文档
man [命令] :查看详细内容
info [主题] :访问GUN项目的Info文档
alias
创建命令别名
alias :查看所有别名
alias ll='ls -l':设置‘ll’为‘ls -l’的别名
chmod
,chown
,chgrp
修改文件权限,所属用户和组
chmod 750 文件名
数字7代表所有者权限(4+2+1=7,即读/写/执行)。
数字5代表组权限(4+1=5,即读/执行)。
末尾的0代表其他用户无权限。
sudo chown 新用户名 文件名
sudo chgrp 新组名 文件名
history
查看命令历史记录
history :显示所有历史命令
shell脚本编辑
Shell脚本本质上是纯文本文件(.sh),其中包含一系列要由shell(如bash、sh、zsh等)执行的命令。
#!/bin/bash
echo "Hello, World!"
ls -l
shell变量
在Shell脚本中,变量是用于存储数据的占位符。Shell变量可以存储数字、字符串、文件名等任何类型的数据。Shell变量是区分大小写的,并且在使用时不需要声明其类型。
定义变量
# 定义一个字符串变量
my_string="Hello, World!"
# 定义一个数字变量
my_number=42
# 定义一个特殊字符或空格的变量(需要使用引号)
my_special_var="This is a string with spaces"
使用变量
# 引用变量
echo $my_string # 输出: Hello, World!
echo $my_number # 输出: 42
echo $my_special_var # 输出: This is a string with spaces
# 也可以使用花括号来明确变量的边界(当变量名后紧跟其他字符时)
echo ${my_string}World # 输出: Hello, World!World
# 变量名大小写敏感
echo $MY_STRING # 输出为空,因为MY_STRING未定义
变量赋值
# 使用反引号进行命令替换
files_count=`ls | wc -l`
echo $files_count # 输出当前目录下的文件数量
# 使用$(...)进行命令替换
files_count=$(ls | wc -l)
echo $files_count # 同样输出当前目录下的文件数量
shell运算符
算数运算符
#!/bin/bash
# 直接赋值
num1=10
num2=20
# 加法
sum=$((num1 + num2))
echo "The sum is: $sum"
# 乘法
product=$((num1 * num2))
echo "The product is: $product"
# 幂运算(使用expr命令)
result=$(expr $num1 ** $num2)
echo "The result of $num1 to the power of $num2 is: $result"
# 赋值运算符
num1+=5
echo "After adding 5 to num1, it is: $num1"
关系运算符
#!/bin/bash
num1=10
num2=20
if [ $num1 -eq $num2 ]; then
echo "num1 is equal to num2"
elif [ $num1 -gt $num2 ]; then
echo "num1 is greater than num2"
else
echo "num1 is less than num2"
fi
布尔运算符
#!/bin/bash
num1=10
num2=20
if [ $num1 -eq 10 ] && [ $num2 -eq 20 ]; then
echo "Both num1 and num2 are correct"
else
echo "At least one of the numbers is incorrect"
fi
字符串运算符
#!/bin/bash
str1="Hello"
str2="World"
if [ $str1 = $str2 ]; then
echo "$str1 is equal to $str2"
else
echo "$str1 is not equal to $str2"
fi
# 检查字符串长度是否为零
str3=""
if [ -z "$str3" ]; then
echo "str3 is empty"
else
echo "str3 is not empty"
fi
文件测试运算符
#!/bin/bash
file="/path/to/some/file.txt"
if [ -e "$file" ]; then
echo "The file $file exists"
elif [ -d "$file" ]; then
echo "The $file is a directory"
else
echo "The file $file does not exist"
fi
# 检查文件是否可读、可写、可执行
if [ -r "$file" ]; then
echo "The file $file is readable"
fi
if [ -w "$file" ]; then
echo "The file $file is writable"
fi
if [ -x "$file" ]; then
echo "The file $file is executable"
fi
命令替换运算符
#!/bin/bash
# 使用命令替换获取当前日期
today=$(date)
echo "Today's date is: $today"
# 使用命令替换获取文件内容(假设文件为file.txt)
content=$(cat file.txt)
echo "The content of file.txt is:"
echo "$content"
字符串引用
#!/bin/bash
name="John Doe"
greeting="Hello, ${name}!"
echo "$greeting" # 输出: Hello, John Doe!
# 使用双引号保留特殊字符
path="/home/$USER/Documents"
echo "$path" # 输出: /home/username/Documents(其中username是当前登录用户的用户名)
shell条件判断
在Shell脚本中,条件判断是非常重要的,它允许脚本根据某些条件执行不同的代码块。Shell提供了多种条件判断的方式,下面是一些常见的例子:
测试命令
* `[ ]` 或 `test` 命令用于执行条件测试。
* 常见的测试有文件测试(如 `-f` 检查文件是否存在且是一个普通文件)、字符串测试(如 `=`, `!=` 比较字符串)和数字测试(如 `-eq`, `-ne`, `-gt`, `-lt`, `-ge`, `-le` 比较数字)。
if 语句
使用 if
, elif
和 else
进行条件判断。
if [ condition ]; then
# code to execute if condition is true
elif [ another_condition ]; then
# code to execute if another_condition is true
else
# code to execute if none of the conditions are true
fi
字符串比较
* `=`, `==`:检查两个字符串是否相等。
* `!=`:检查两个字符串是否不相等。
* `-z`:检查字符串长度是否为零。
* `-n`:检查字符串长度是否非零。
数字比较
* `-eq`:等于
* `-ne`:不等于
* `-gt`:大于
* `-lt`:小于
* `-ge`:大于或等于
* `-le`:小于或等于
文件测试
* `-e`:文件存在
* `-f`:是一个普通文件
* `-d`:是一个目录
* `-r`:文件可读
* `-w`:文件可写
* `-x`:文件可执行
* `-s`:文件大小非零
* `-L`:是一个符号链接
* 等等...
逻辑操作符
* `!`:逻辑非
* `-a` 或 `&&`:逻辑与
* `-o` 或 `||`:逻辑或
示例
#!/bin/bash
# 检查文件是否存在
if [ -f "/path/to/file.txt" ]; then
echo "File exists."
else
echo "File does not exist."
fi
# 检查两个数字是否相等
a=10
b=20
if [ $a -eq $b ]; then
echo "a is equal to b"
else
echo "a is not equal to b"
fi
# 使用逻辑操作符
if [ -f "/path/to/file1.txt" ] && [ -f "/path/to/file2.txt" ]; then
echo "Both files exist."
else
echo "One or both files do not exist."
fi
注意:在 [
和 ]
之间以及 [
之后和 ]
之前都需要有空格。例如,[ -f "/path/to/file.txt" ]
是正确的,但 [ -f"/path/to/file.txt"]
是错误的。
shell流程控制
在Shell脚本中,流程控制是非常重要的,它允许脚本根据条件或循环执行不同的代码块。除了前面提到的条件判断(如if
、elif
、else
)外,Shell还提供了循环结构(如for
、while
、until
)以及控制结构(如break
、continue
)。
条件判断(if
, elif
, else
)
之前已经提到,if
语句用于根据条件执行不同的代码块。
if [ condition ]; then
# code to execute if condition is true
elif [ another_condition ]; then
# code to execute if another_condition is true
else
# code to execute if none of the conditions are true
fi
循环结构
-
for循环:用于遍历列表(如数组或字符串)中的元素。
for variable in list do # code to execute for each element in list done
或者使用C风格的for循环:
for (( i=0; i<10; i++ )) do # code to execute for each iteration done
-
while循环:当条件为真时,重复执行代码块。
while [ condition ] do # code to execute while condition is true done
-
until循环:当条件为假时,重复执行代码块。
until [ condition ] do # code to execute until condition is true done
控制结构
-
break:用于立即终止循环(最内层循环)。
while [ true ] do # some code if [ some_condition ]; then break fi done
-
continue:用于跳过当前循环迭代,直接进入下一次迭代。
for file in * do if [ -d "$file" ]; then continue # skip directories fi # process files done
函数:允许你定义可重用的代码块,并在脚本中多次调用。
function my_function() {
# code to execute when function is called
}
# calling the function
my_function
-
case语句:类似于其他编程语言中的switch语句,用于根据变量的值执行不同的代码块。
case $variable in pattern1) # code to execute if $variable matches pattern1 ;; pattern2) # code to execute if $variable matches pattern2 ;; *) # code to execute if $variable doesn't match any patterns ;; esac
-
select语句:用于创建菜单,允许用户从一组选项中选择一个。
select option in "Option 1" "Option 2" "Quit" do case $option in "Option 1") # code for Option 1 ;; "Option 2") # code for Option 2 ;; "Quit") break ;; *) echo "Invalid option" ;; esac done
这些流程控制结构使Shell脚本能够处理复杂的逻辑和场景。
shell读取控制台输入
在Shell脚本中,你可以使用read
命令来读取控制台输入。read
命令允许你从标准输入(通常是键盘)读取一行数据,并将其存储在变量中。
以下是如何使用read
命令的基本示例:
#!/bin/bash
# 提示用户输入名字
echo -n "请输入你的名字: "
read name
# 输出用户输入的名字
echo "你好, $name!"
# 也可以同时读取多个变量的值
echo -n "请输入你的名字和年龄,用空格分隔: "
read firstname lastname age
# 输出用户输入的名字和年龄
echo "你好, $firstname $lastname! 你的年龄是 $age。"
在上面的脚本中,echo -n
命令用于打印提示信息,但是-n
选项会阻止换行符的打印,这样提示信息就会和用户的输入在同一行显示。
read
命令后面跟着的变量名(如name
、firstname
、lastname
和age
)用于存储用户的输入。当用户输入数据后,这些数据会被存储在相应的变量中,然后你可以在你的脚本中使用这些变量。
如果你想要读取密码或其他敏感信息,并且不希望这些信息在输入时显示在屏幕上,你可以使用read
命令的-s
选项,这样用户的输入就会被隐藏:
echo -n "请输入密码: "
read -s password
echo
# 注意:这里我们加了一个echo命令来创建一个新的行,因为-s选项会阻止换行符的打印
另外,如果你想要限制用户输入的字符数,你可以使用-n
选项(注意这里的-n
和前面用于禁止换行的-n
不同)和一个数字来指定最大字符数:
echo -n "请输入最多5个字符的字符串: "
read -n 5 input_string
echo
# input_string现在将包含用户输入的前5个字符(或更少的字符,如果用户输入少于5个字符)