20分钟 Bash 上手指南

news2025/2/26 17:40:33

文章目录

    • bash 概念与学习目的
    • 第一个 bash 脚本
    • bash 语法
      • 变量的使用
      • 位置参数
      • 管道符号(过滤条件)
      • 重定向符号
      • 条件测试命令
      • 条件语句
      • case 条件分支
      • Array
      • for 循环
      • 函数
      • exit 关键字
    • bash 脚本
      • 记录历史命令
      • 查询文件
      • 分发内容


bash 概念与学习目的

bash(Bourne Again Shell)是一种广泛使用的 Unix/Linux Shell(命令行界面)。它是由 Brian Fox 为 GNU 项目开发的,是 Bourne Shell(sh)的增强版本,因此得名 “Bourne Again”。

Bash 是大多数 Linux 发行版(如 Ubuntu、CentOS)和 macOS 的默认 Shell,具有如 命令历史记录、管道、重定向、变量操作以及脚本编写能力

相比于 bash , Python 或是 Ansible 脚本更易读写,一般是更好的选择,但是学习 bash 只需要了解基础知识就在可以在生产环境中有更多的选择

bash 初级学习需要少量的 Linux command (vim、cat、echo等)与权限概念基础


第一个 bash 脚本

  1. 创建一个 bash 脚本
vim bash-demo1.sh
  1. 编写第一个 bash 脚本

脚本文件中写入以下内容

#!/bin/bash
echo Hello World!

其中,第一行注解告诉 Linux 操作系统采用哪一个 bash 解释器(默认选项,可省略),第二行会回显输出 Hello World

退出插入模式 :wq (或是键盘大写后按键 ZZ)保存退出

在这里插入图片描述

  1. 为脚本添加可执行权限

执行脚本首先需要先赋予脚本执行权限

ls -l ls 命令的 long 格式查看脚本是否具有执行权限

在这里插入图片描述

可以看到 root用户、root同组用户、其他用户 都没有 x - 执行权限

# 为当前用户添加执行权限
chmod u+x bash-demo1.sh
# 为所有用户添加执行权限
chmod +x bash-demo1.sh

在这里插入图片描述

作者的当前用户为 root ,可以看到 root 权限栏出现 x 执行权限

前三个字母为 root 用户读写执行权限,中间三个字母为 root同组用户读写执行权限、最后三个字母为其他用户的读写执行权限

  1. 执行 bash 脚本
./bash-demo1.sh
# 或是在不更改脚本执行权限的情况下
bash bash-demo1.sh

在这里插入图片描述


bash 语法

变量的使用

  • 变量在路径中的使用

此处编写一个可用于文件复制的 bash shell

#!/bin/bash
cp /home/fishpie/workspace/bash-shell/tempdir01/demo1.txt /home/fishpie/workspace/bash-shell/tempdir02/
cp /home/fishpie/workspace/bash-shell/tempdir02/demo2.txt /home/fishpie/workspace/bash-shell/tempdir01/CPfile.txt

可以发现当文件路较长时可读性很差,可以使用变量来解决这个问题

#!/bin/bash
# 变量
MY_LOCATION_FROM=/home/fishpie/workspace/bash-shell/tempdir01
MY_LOCATION_TO=/home/fishpie/workspace/bash-shell/tempdir02
# 显示变量
echo $MY_LOCATION_FROM
echo $MY_LOCATION_TO
# 使用变量
cp "$MY_LOCATION_FROM/demo1.txt" "$MY_LOCATION_TO/"
cp "$MY_LOCATION_TO/demo2.txt" "$MY_LOCATION_FROM/CPfile.txt"

对于变量的使用(引用)需要使用到 $

推荐使用 "" 包裹路径,如果变量的值(比如 $MY_LOCATION_TO 或 $MY_LOCATION_FROM)包含空格,Bash 会将空格视为参数的分隔符,导致命令解析错误


  • 读取输入的变量

读取用户输入,比如常见的 yum 安装软件包过程中的 Y/n 用户输入等需要用户交互的地方

读取用户输入并设置为变量的关键字为 read ,此处编写一个读取用户名称的脚本

#!/bin/bash
# 提示用户输入名字和姓氏
echo What is your first name?
read FIRST_NAME
echo What is your last name?
read LAST_NAME

# 提示用户输入性别选择
echo "Are you male? (Y/n): "
read gender_choice

# 根据用户输入判断性别并显示结果
if [ "$gender_choice" = "Y" ] || [ "$gender_choice" = "y" ]; then
    echo "Name: $FIRST_NAME $LAST_NAME, Gender: Male"
elif [ "$gender_choice" = "N" ] || [ "$gender_choice" = "n" ]; then
    echo "Name: $FIRST_NAME $LAST_NAME, Gender: Female"
else
    echo "Invalid input! Please enter Y/y for male or N/n for female."
fi

在这里插入图片描述


位置参数

在 Linux command 中,所有命令的开头(0号位置,$0)是为 shell 本身保留,是脚本名称或解释器名称

在这里插入图片描述

如果我们想将参数等信息通过 空格 传入,则可以使用位置参数 $1$2$3

#!/bin/bash

echo Hello $1 $2

在这里插入图片描述


管道符号(过滤条件)

管道符号 | 用于将一个命令的输出传递给另一个命令作为输入,是 Bash(及其他 shell)中的一种进程间通信机制

管道符号 | 会将左侧命令的标准输出(stdout)作为右侧命令的标准输入(stdin) (标准流)

  • 标准输出(stdout):命令执行后显示在终端的结果
  • 标准输入(stdin):命令从外部接收的数据(比如键盘输入或管道传递的数据)

管道的本质是:避免中间结果保存到文件,直接在内存中传递数据,提高效率

管道在内存中操作,效率高,但大量数据时可能会占用较多内存

右侧的命令必须能从 stdin 接收输入。例如,ls | cp 是无效的,因为 cp 不支持从 stdin 读取数据

示例:

# 查看本机网络中的 80 端口服务
netstat -tunlp | grep ":80"

# 统计系统中正在运行的进程数量
ps aux | wc -l

# 找出占用 CPU 最多的前 5 个进程
ps aux | sort -k 3 -nr | head -n 5

# 查看系统中所有用户的唯一用户名并排序
cat /etc/passwd | cut -d: -f1 | sort | uniq

重定向符号

重定向符号 >>> 可以将命令的标准输出(stdout)或标准错误(stderr)从默认的终端重定向到文件或其他地方

和管道符号 | 都是非常常用的符号

  • > 将命令的输出写入指定文件,如果文件已存在,则覆盖原有内容
  • >> 将命令的输出追加到指定文件末尾,如果文件已存在,则不覆盖,而是在末尾添加内容
  • < 将文件内容作为命令的输入

在这里插入图片描述

示例:

# 统计当前目录中的所有 txt 文件
ls -l | grep "txt" >> txt_files.txt

# 追加日期到日志文件
date +"%Y-%m-%d" >> log.txt

# 清空文件
> something.txt

# 统计文件行数
wc -l < file.txt

# 将筛选出的 bash 进程信息保存到 processes.txt
ps aux | grep "bash" > processes.txt
  • 进阶用法

这里再次提到标准流

  • 标准输入(stdin,文件描述符 0):命令接收的数据,默认来自键盘
  • 标准输出(stdout,文件描述符 1):命令的正常输出,默认显示在终端
  • 标准错误(stderr,文件描述符 2):命令的错误信息,默认也显示在终端

示例1:

# 重定向标准错误,将标准错误重定向到标准输出的位置
ls tempdir03/ tempdir05/ 2>&1 > output.txt

在这里插入图片描述

如果不加入 &1 参数

ls tempdir03/ tempdir05/ 2> output.txt

在这里插入图片描述

可见不会显示错误信息

示例2:

在组合重定向时,顺序很重要

ls > file.txt 2>&1  # 正确
ls 2>&1 > file.txt  # 错误:stderr 不会进入 file.txt

条件测试命令

test 或者 [ ]空格是必须的,用于条件判断,通常与 if、while 等流程控制语句搭配使用,来检查文件状态、比较数值或字符串等

[ ] 的正式名称:test 命令,其实 [ ] 就是 test 命令的符号化

[ -f /etc/passwd ]
# 等价于
test -f /etc/passwd

在这里插入图片描述

echo $? 用于查看上一个命令的退出状态,输出 0 则为真,输出1 则为 假

常见用法与分类

  • 文件测试
测试选项含义示例
-e文件是否存在[ -e /etc/passwd ]
-f是否为普通文件(非目录)[ -f /etc/passwd ]
-d是否为目录[ -d /home ]
-r是否可读[ -r file.txt ]
-w是否可写[ -w file.txt ]
-x是否可执行[ -x script.sh ]
-s文件是否非空(大小大于 0)[ -s log.txt ]
# 判断 /etc/passwd 是否为一个文件
if [ -f /etc/passwd ]; then
    echo "passwd file exists and is a regular file"
fi
  • 字符串比较
测试选项含义示例
= 或 ==字符串是否相等[ “$str” = “hello” ]
!=字符串是否不相等[ “$str” != “hello” ]
-z字符串是否为空[ -z “$str” ]
-n字符串是否非空[ -n “$str” ]
# 判断字符串是否相等
name="Alice"
if [ "$name" = "Alice" ]; then
    echo "Hello, Alice!"
fi

【注】:变量需要用双引号 “$name” 包裹,避免变量为空时语法错误

例如:

var=""
[ $var = "" ]  # 出错,解析为 [ = "" ]
[ "$var" = "" ]  # 正确
  • 数值比较
测试选项含义示例
-eq等于[ 5 -eq 5 ]
-ne不等于[ 5 -ne 6 ]
-gt大于[ 10 -gt 5 ]
-lt小于[ 5 -lt 10 ]
-ge大于等于[ 10 -ge 10 ]
-le小于等于[ 5 -le 6 ]
# 判断年龄是否大于 18 岁
age=20
if [ "$age" -gt 18 ]; then
    echo "You are an adult."
fi
  • 逻辑运算
操作符含义示例
-a与(AND)[ -f file.txt -a -r file.txt ]
-o或(OR)[ “ a g e " − g t 18 − o " age" -gt 18 -o " age"gt18o"age” -eq 18 ]
!非(NOT)[ ! -d /tmp ]

注意空格的使用!

# 判断 file.txt 是否为普通文件,是否有写权限
if [ -f file.txt -a -w file.txt ]; then
    echo "file.txt exists and is writable"
fi

可能会注意到,如果遇到了需要正则表达式,如判断一个变量是否符合某个格式

Bash 中还有一个增强版 [[ ]],功能更强大,支持**正则匹配(=~)**等,且对未定义变量更宽容

# 检查 $var 是否为数字
[[ $var =~ ^[0-9]+$ ]]
# 正则匹配(=~)

条件语句

if elif else ,注意不是 elsif

与条件测试命令搭配使用

基本语法:

if [ 条件 ]; then
    # 条件为真时执行的代码
elif [ 条件 ]; then
    # 上一个条件为假,此条件为真时执行的代码
else
    # 所有条件都为假时执行的代码
fi

此处编写一个根据用户输入的数字判断其范围的脚本:

#!/bin/bash

echo "Please enter a number: "
read num

if [ "$num" -gt 0 ]; then
    echo "$num is positive."
elif [ "$num" -lt 0 ]; then
    echo "$num is negative."
else
    echo "$num is zero."
fi

在这里插入图片描述

  • 多条件组合

使用逻辑运算符(如 -a、-o)或 &&、|| 组合条件

# 判断 85 分是一个什么样的等级
score=85
if [ "$score" -ge 90 ]; then
    echo "Grade: A"
elif [ "$score" -ge 80 ] && [ "$score" -lt 90 ]; then
    echo "Grade: B"
elif [ "$score" -ge 70 ]; then
    echo "Grade: C"
else
    echo "Grade: D"
fi
  • 嵌套结构

if 内部嵌套另一个 if ,特别注意脚本的结构问题

# 判断 25 岁是一个什么样的年龄
age=25
if [ "$age" -gt 18 ]; then
    if [ "$age" -lt 30 ]; then
        echo "Young adult"
    else
        echo "Adult"
    fi
else
    echo "Minor"
fi
  • 正则表达式作为判断条件
# 判断 名字是否以 F 开头
name="FISHPIE"
if [[ "$name" =~ ^F ]]; then
    echo "Name starts with F"
else
    echo "Name does not start with F"
fi

示例脚本:

  1. 用户输入输出处理
#!/bin/bash

read -p "Enter Y/N: " choice
if [ "$choice" = "Y" ] || [ "$choice" = "y" ]; then
    echo "Yes"
elif [ "$choice" = "N" ] || [ "$choice" = "n" ]; then
    echo "No"
else
    echo "Invalid input"
fi

在这里插入图片描述

  1. 文件检查
#!/bin/bash

if [ -f "data.txt" ]; then
    echo "File exists"
elif [ -d "data.txt" ]; then
    echo "It's a directory"
else
    echo "File does not exist"
fi

case 条件分支

case 语句是一种条件分支结构,类似于 if-elif-else,但它更适合处理多分支选择,尤其是需要根据变量值匹配多个模式时

基本语法:

case 表达式 in
    模式1)
        # 匹配模式1时执行的代码
        ;;
    模式2)
        # 匹配模式2时执行的代码
        ;;
    *)
        # 默认情况(可选)
        ;;
esac
  • case 表达式:指定要匹配的值(通常是变量)
  • in:开始模式匹配部分
  • 模式):定义匹配的模式,后面跟 )
  • ;;:表示该分支的代码结束,类似 break
  • *****:通配符,表示默认分支(当没有模式匹配时执行)
  • esac:case 的结束标志(case 反过来)

对格式的要求相对严格

示例:

  • 用户输入匹配
#!/bin/bash

echo "Enter a fruit: "
read fruit

case "$fruit" in
    "apple")
        echo "You chose an apple."
        ;;
    "banana")
        echo "You chose a banana."
        ;;
    "orange")
        echo "You chose an orange."
        ;;
    *)
        echo "Unknown fruit: $fruit"
        ;;
esac

在这里插入图片描述

  • 多模式匹配与命令结合
#!/bin/bash

# case 中可以直接匹配命令的输出
case $(uname) in
    "Linux")
        echo "Running on Linux"
        ;;
    "Darwin")
        echo "Running on macOS"
        ;;
    *)
        echo "Unknown system: $(uname)"
        ;;
esac

# 有限可写条件中的一种
echo "Enter a day (mon/tue/wed/etc): "
read day

case "$day" in
    "mon"|"tue"|"wed"|"thu"|"fri")
        echo "Weekday"
        ;;
    "sat"|"sun")
        echo "Weekend"
        ;;
    *)
        echo "Invalid day: $day"
        ;;
esac

在这里插入图片描述


Array

数组(Array) 是一种数据结构,用于存储多个有序的值(元素),这些值可以通过索引(下标)访问,虽然不如其他编程语言那样灵活强大,但也是 bash 中不可或缺的一部分

在这里插入图片描述

  • 数组的使用
# 直接赋值
array_name=(value1 value2 value3)
# 逐个赋值
array[0]="value1"
array[1]="value2"
array[2]="value3"# 获取数组长度
echo ${#array[@]}

# 切片
array=(1 2 3 4 5)
echo ${array[@]:1:3}  # 从索引 1 开始,取 3 个元素

在这里插入图片描述


for 循环

用于逐个处理一组数据(如列表、数组、文件等)。它特别适合在已知迭代次数或需要遍历集合时使用

基本语法:

  1. 传统派:
for 变量 in 列表; do
    # 执行的代码
done
  1. 现代派:

在 Bash 3.0+ 中可以采用 C 语言风格编写,类似 C/C++ 的 for (i=0; i<5; i++)

for (( 初始值; 条件; 步进 )); do
    # 执行的代码
done

示例:

  • 批量复制数组中存在的文件
#!/bin/bash

files=("file1.txt" "file2.txt" "file3.txt")

for file in "${files[@]}"; do
    if [ -f "$file" ]; then
        echo "$file exists, copying..."
        cp "$file" "/tmp/"
    else
        echo "$file does not exist"
    fi
done
  • 通过直接遍历命令结果来查找当前目录下的 txt 文件
#!/bin/bash

for file in *.txt; do
        echo "Found TXT file: $file"
done

在这里插入图片描述

  • 检查多个主机是否在线
#!/bin/bash

hosts=("192.168.1.1" "google.com" "8.8.8.8")

for host in "${hosts[@]}"; do
    ping -c 2 "$host" > /dev/null
    if [ $? -eq 0 ]; then
        echo "$host is online"
    else
        echo "$host is offline"
    fi
done

ping -c 2 发送 2 个数据包,$? 检查命令退出状态

  • 批量生成文件
#!/bin/bash

for (( i=1; i<=3; i++ )); do
    touch "file$i.txt"
    echo "Created file$i.txt"
done

#或是
for i in {1..3}; do
    touch "file$i.txt"
    echo "Created file$i.txt"
done

【注】:遍历列表中的元素如果带有 空格 则该元素需要使用 " " 包裹**


循环之间的比较

循环类型适用场景示例
for遍历列表、数组、范围for i in 1 2 3; do
while条件不确定时while [ $x -lt 5 ]; do
until条件为假时循环until [ $x -eq 0 ]; do

函数

在 Bash 脚本中,函数(Function) 是一种将一组命令封装成可重用代码块的方法。定义一个函数后,可以通过调用它的名称来执行其中的代码,并且可以传递参数给函数以增加灵活性

解耦合,模块化,精简代码

基本语法:

  1. 使用 function 关键字
function 函数名 {
    # 函数体
}
  1. 精简写法
函数名() {
    # 函数体
}

示例:

#!/bin/bash

greet() {
        echo "Hello,$1! You are $2 years old,The time now is $(date +"%Y-%m-%d")"
}

# 调用函数并传递参数
greet "Tom" 21

在这里插入图片描述

  • 局部变量

默认情况,函数内的变量是全局的,可以用 local 关键字定义局部变量,避免污染外部环境

#!/bin/bash

my_function() {
    local name="$1"  # 局部变量
    echo "Inside function: $name"
}

name="Global"
my_function "Local"
echo "Outside function: $name"

在这里插入图片描述

  • 返回值
  1. 当 Bash 函数没有直接返回值,则可以通过 return 返回退出状态(0~255,0表示成功)
#!/bin/bash

check_number() {
    if [ "$1" -gt 0 ]; then
        return 0  # 成功
    else
        return 1  # 失败
    fi
}

check_number 5
if [ $? -gt 0 ]; then
    echo "Positive number"
else
    echo "Non-positive number"
fi

$? 获取上一个命令(函数)的退出状态

  1. 通过 echo 返回值
#!/bin/bash

add() {
# 在 (()) 内计算 $1 + $2 的和
# 通过 $() 将计算结果捕获为字符串
# echo 将这个结果输出
    echo $(($1 + $2))
}

# = 是用于判断字符串是否相同
# $() 将计算结果捕获为字符串
result=$(add 3 4)
echo "Sum is: $result"

在 (()) 内部,可以直接进行数学运算(如加减乘除),无需额外的命令(如 expr)

$1 + $2 表示将函数的第一个参数 $1 和第二个参数 $2 相加


exit 关键字

只需要记住: exit 命令会立即结束当前脚本的执行,并返回一个状态码给调用它的环境

退出状态码:

  • 0:表示成功(默认值)
  • 非0:表示失败或某种错误,通常由开发者定义具体含义
#!/bin/bash

echo "Script starts"
exit
echo "This won't run"

在这里插入图片描述

  • 带状态码退出
#!/bin/bash

# 检查是否提供了参数
if [ $# -ne 1 ]; then
    echo "Usage: $0 <filename>"
    exit 1
fi

# 获取传入的文件名参数
filename="$1"

echo "Checking file: $filename"
if [ -f "$filename" ]; then
    echo "File exists"
    exit 0  # 成功退出
else
    echo "File not found"
    exit 1  # 失败退出
fi

在这里插入图片描述

$# 表示参数个数,-ne 1 表示 “不等于 1"

如果参数数量不对,提示用法并退出(状态码 1)

  • exit 与 return 的区别
特征exitreturn
作用范围终止整个脚本仅退出当前函数
使用场景脚本级别退出函数级别返回
状态码返回给父进程返回给调用函数的地方

推荐文章:

Linux常用工具(LTS)_linux lts-CSDN博客

Linux手记(LTS)_linux lts-CSDN博客


bash 脚本

记录历史命令

#!/bin/bash

LOG_DIR="$HOME/command_logs"
LOG_FILE="$LOG_DIR/command_history.log"

if [ ! -d "$LOG_DIR" ]; then
    mkdir -p "$LOG_DIR" || { echo "Error: Failed to create directory"; exit 1; }
fi

# 确保历史文件存在
HISTFILE=${HISTFILE:-"$HOME/.bash_history"}

# 强制写入当前会话历史
history -a

timestamp=$(date "+%Y-%m-%d %H:%M:%S")

# 从 $HISTFILE 获取前 50 条命令
commands=$(tail -n 50 "$HISTFILE")

if [ -z "$commands" ]; then
    echo "No commands found in history file $HISTFILE."
    exit 1
fi

echo "Logging commands at $timestamp:" >> "$LOG_FILE"
echo "$commands" | while IFS= read -r cmd; do
    echo "[$timestamp] $cmd" >> "$LOG_FILE"
done

echo "Commands logged to $LOG_FILE"
exit 0

命令执行日志

cat ~/command_logs/command_history.log

查询文件

根据指定模式查询所有已连接服务器中包含 xx 内容或名称的文件或目录

#!/bin/bash

# 检查是否提供了搜索模式
if [ $# -lt 1 ]; then
    echo "Usage: $0 <pattern> [content_search]"
    echo "  <pattern>: File or directory name pattern (e.g., '*.txt')"
    echo "  [content_search]: Optional, search for this string in file contents"
    exit 1
fi

# 获取参数
pattern="$1"          # 文件或目录名称模式
content="$2"          # 可选的内容搜索字符串

# 定义已连接的服务器列表(假设通过 SSH 访问)
servers=("server1.example.com" "server2.example.com" "server3.example.com")
# 替换为实际的服务器地址或从配置文件读取

# 本地搜索路径(可根据需要修改)
search_path="/home/user"

# 循环遍历每个服务器
for server in "${servers[@]}"; do
    echo "Searching on $server..."

    # 如果没有指定内容搜索,则只查找文件名或目录名
    if [ -z "$content" ]; then
        ssh "$server" "find $search_path -name \"$pattern\"" 2>/dev/null
    else
        # 如果指定了内容搜索,则查找文件并检查内容
        ssh "$server" "find $search_path -name \"$pattern\" -type f -exec grep -l \"$content\" {} +" 2>/dev/null
    fi
done

echo "Search completed."
exit 0

$1:文件名或目录名的模式(如 *.txt)
$2(可选):文件内容中要搜索的字符串(如 xx)

servers 数组中列出目标服务器,需替换为实际地址
假设使用 SSH 访问,需配置免密登录

使用示例:

# 查找所有 .txt 文件
./search_servers.sh "*.txt"
# 查找包含 "xx" 的 .txt 文件
./search_servers.sh "*.txt" "xx"

分发内容

分发当前文件到指定服务器目录,可选择是否替换指定服务器原有的分发文件

#!/bin/bash

# 检查参数数量
if [ $# -lt 2 ]; then
    echo "Usage: $0 <file> <dest_path> [replace]"
    echo "  <file>: File to distribute"
    echo "  <dest_path>: Destination directory on servers (e.g., /home/user/files)"
    echo "  [replace]: 'yes' to replace existing files, omit or any other value for no"
    exit 1
fi

# 获取参数
file="$1"          # 要分发的文件
dest_path="$2"     # 目标路径
replace="$3"       # 是否替换(yes 或其他)

# 检查文件是否存在
if [ ! -f "$file" ]; then
    echo "Error: File '$file' does not exist."
    exit 1
fi

# 定义目标服务器列表
servers=("server1.example.com" "server2.example.com" "server3.example.com")
# 替换为实际服务器地址

# 分发文件
for server in "${servers[@]}"; do
    echo "Distributing to $server..."

    # 检查目标路径是否已有同名文件
    if ssh "$server" "[ -f \"$dest_path/$(basename "$file")\" ]" 2>/dev/null; then
        if [ "$replace" = "yes" ]; then
            echo "Replacing existing file on $server..."
            scp "$file" "$server:$dest_path/" 2>/dev/null
        else
            echo "File exists on $server, skipping (use 'yes' to replace)."
        fi
    else
        # 文件不存在,直接分发
        scp "$file" "$server:$dest_path/" 2>/dev/null
        if [ $? -eq 0 ]; then
            echo "Successfully distributed to $server."
        else
            echo "Failed to distribute to $server."
        fi
    fi
done

echo "Distribution completed."
exit 0

$1:要分发的文件名
$2:目标服务器上的目录路径
$3(可选):yes 表示替换现有文件,否则跳过

servers 数组中列出目标服务器,需替换为实际地址
假设使用 SSH 访问,需配置免密登录

使用示例:

# 分发文件,不替换已有文件
./distribute_file.sh myfile.txt /home/user/files
# 分发文件并替换已有文件
./distribute_file.sh myfile.txt /home/user/files yes

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2306493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【虚拟仪器技术】labview操作指南和虚拟仪器技术习题答案(一)

今天是2025年2月24日&#xff0c;画的是fate/Grand Order里面的阿尔托莉雅.卡斯特&#xff0c;武内老师的画。 目录 第1章 第2章 第3章 第4章 第5章 关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程…

LabVIEW电能质量分析软件

随着电力系统的复杂性增加&#xff0c;电能质量问题日益突出&#xff0c;传统的电能质量检测装置多采用DSP技术&#xff0c;不仅开发周期长、功能单一&#xff0c;而且在多功能集成方面存在局限性。基于LabVIEW虚拟仪器开发平台的电能质量分析软件利用FFT、STFT、WT、HHT等多种…

视频裂变加群推广分享引流源码

源码介绍 视频裂变加群推广分享引流源码 最近网上很火&#xff0c;很多人都在用&#xff0c;适合引流裂变推广 测试环境&#xff1a;PHP7.4(PHP版本不限制) 第一次访问送五次观看次数&#xff0c;用户达到观看次数后需要分享给好友或者群,好友必须点击推广链接后才会增加观看次…

项目一 - 任务3:搭建Java集成开发环境IntelliJ IDEA

通过本次实战&#xff0c;我们成功搭建了Java集成开发环境IntelliJ IDEA&#xff0c;并完成了多个任务。首先&#xff0c;安装了IntelliJ IDEA并进行了个性化设置&#xff0c;如选择主题、调整字体和编码等。接着&#xff0c;创建了Java项目、包和类&#xff0c;编写并运行了简…

RoCBert:具有多模态对比预训练的健壮中文BERT

摘要 大规模预训练语言模型在自然语言处理&#xff08;NLP&#xff09;任务上取得了最新的最优结果&#xff08;SOTA&#xff09;。然而&#xff0c;这些模型容易受到对抗攻击的影响&#xff0c;尤其是对于表意文字语言&#xff08;如中文&#xff09;。 在本研究中&#xff0…

DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库

项目地址&#xff1a;https://github.com/deepseek-ai/DeepEP 开源日历&#xff1a;2025-02-24起 每日9AM(北京时间)更新&#xff0c;持续五天 (2/5)&#xff01; ​ ​ 引言 在大模型训练中&#xff0c;混合专家模型&#xff08;Mixture-of-Experts, MoE&#xff09;因其动…

六十天前端强化训练之第二天CSS选择器与盒模型深度解析

欢迎来到编程星辰海的博客讲解 目录 一、CSS 核心概念 1. 三种引入方式 2. CSS 注释 3. 常见单位系统 二、CSS选择器核心知识 1. 基础选择器类型 2. 组合选择器 3. 伪类选择器&#xff08;部分示例&#xff09; 4. 优先级计算规则 三、盒模型深度解析 1. 标准盒模型图…

分享httprunner 结合django实现平台接口自动化方案

说明&#xff0c;可以直接在某个视图集定义自定义接口来验证。 调试1&#xff1a;前端界面直接编写yaml文件. 新增要实现存数据到mysql&#xff0c;同时存文件到testcase下, 如test.yaml 更新yaml数据&#xff0c;同时做到更新 testcase下的文件&#xff0c;如test.yaml acti…

本地大模型编程实战(22)用langchain实现基于SQL数据构建问答系统(1)

使 LLM(大语言模型) 系统能够查询结构化数据与非结构化文本数据在性质上可能不同。后者通常生成可在向量数据库中搜索的文本&#xff0c;而结构化数据的方法通常是让 LLM 编写和执行 DSL&#xff08;例如 SQL&#xff09;中的查询。 我们将演练在使用基于 langchain 链 &#x…

速通HTML

目录 HTML基础 1.快捷键 2.标签 HTML进阶 1.列表 a.无序列表 b.有序列表 c.定义列表 2.表格 a.内容 b.合并单元格 3.表单 a.input标签 b.单选框 c.上传文件 4.下拉菜单 5.文本域标签 6.label标签 7.按钮标签 8.无语义的布局标签div与span 9.字符实体 HTML…

博客系统完整开发流程

前言 通过前⾯课程的学习, 我们掌握了Spring框架和MyBatis的基本使用, 并完成了图书管理系统的常规功能开发, 接下来我们系统的从0到1完成⼀个项⽬的开发. 企业开发的流程 1. 需求评审(产品经理(PM)会和运营(想口号),UI,测试,开发等沟通) ,会涉及到背景/目标/怎么做,可能会有多…

【C语言】指针笔试题

前言&#xff1a;上期我们介绍了sizeof与strlen的辨析以及sizeof&#xff0c;strlen相关的一些笔试题&#xff0c;这期我们主要来讲指针运算相关的一些笔试题&#xff0c;以此来巩固我们之前所学的指针运算&#xff01; 文章目录 一&#xff0c;指针笔试题1&#xff0c;题目一…

【Qt】桌面应用开发 ------ 绘图事件和绘图设备 文件操作

文章目录 9、绘图事件和绘图设备9.1 QPainter9.2 手动触发绘图事件9.3 绘图设备9.3.1 QPixmap9.3.2 QImage9.3.3 QImage与QPixmap的区别9.3.4 QPicture 10、文件操作10.1 文件读写10.2 二进制文件读写10.3 文本文件读写10.4 综合案例 9、绘图事件和绘图设备 什么时候画&#x…

python与C系列语言的差异总结(3)

与其他大部分编程语言不一样&#xff0c;Python使用空白符&#xff08;whitespace&#xff09;和缩进来标识代码块。也就是说&#xff0c;循环体、else条件从句之类的构成&#xff0c;都是由空白符加上冒号(:)来确定的。大部分编程语言都是使用某种大括号来标识代码块的。下面的…

OpenCV(9):视频处理

1 介绍 视频是由一系列连续的图像帧组成的&#xff0c;每一帧都是一幅静态图像。视频处理的核心就是对这些图像帧进行处理。常见的视频处理任务包括视频读取、视频播放、视频保存、视频帧处理等。 视频分析: 通过视频处理技术&#xff0c;可以分析视频中的运动、目标、事件等。…

【C++设计模式】观察者模式(1/2):从基础到优化实现

1. 引言 在 C++ 软件与设计系列课程中,观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里,我们已对观察者模式有了初步认识,本次将在前两次课程的基础上,进一步深入研究,着重解决观察者生命周期问题,提升代码的安全性、灵活性…

在 CentOS 7.9上部署 Oracle 11.2.0.4.0 数据库

目录 在 CentOS 7.9上部署 Oracle 11.2.0.4.0 数据库引言安装常见问题vim粘贴问题 环境情况环境信息安装包下载 初始环境准备关闭 SELinux关闭 firewalld 安装前初始化工作配置主机名安装依赖优化内核参数限制 Oracle 用户的 Shell 权限配置 PAM 模块配置swap创建用户组与用户,…

计算机毕业设计SpringBoot+Vue.js足球青训俱乐部管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我站在人潮中央&#xff0c;思考这日日重复的生活。我突然想&#xff0c…

QSplashScreen --软件启动前的交互

目录 QSplashScreen 类介绍 使用方式 项目中使用 THPrinterSplashScreen头文件 THPrinterSplashScreen实现代码 使用代码 使用效果 QSplashScreen 类介绍 QSplashScreen 是 Qt 中的一个类&#xff0c;用于显示启动画面。它通常在应用程序启动时显示&#xff0c;以向用户显…