shell脚本编写基础——学习笔记更新ing

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追踪网络数据包传输路径
是一个网络诊断工具,用于跟踪和显示数据包从源主机到目标主机所经过的每一跳(路由器)的路径。
其他
maninfo查看命令的帮助文档
man [命令]  :查看详细内容
info [主题] :访问GUN项目的Info文档
alias创建命令别名
alias :查看所有别名
alias ll='ls -l':设置‘ll’为‘ls -l’的别名
chmodchownchgrp 修改文件权限,所属用户和组
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, elifelse 进行条件判断。

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脚本中,流程控制是非常重要的,它允许脚本根据条件或循环执行不同的代码块。除了前面提到的条件判断(如ifelifelse)外,Shell还提供了循环结构(如forwhileuntil)以及控制结构(如breakcontinue)。

条件判断(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
  1. 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
    
  2. 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命令后面跟着的变量名(如namefirstnamelastnameage)用于存储用户的输入。当用户输入数据后,这些数据会被存储在相应的变量中,然后你可以在你的脚本中使用这些变量。

如果你想要读取密码或其他敏感信息,并且不希望这些信息在输入时显示在屏幕上,你可以使用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个字符)
  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值