shell命令编写

简介: shell命令编写

1.png2.png

1.

  1 #!/bin/bash 
  2 
  3 directory_path="/txh"
  4 
  5 # 使用 find 命令查找指定路径下的文件,并使用 wc 命令统计行数(即文件个数)
  6 
  7 file_count=$(find "directory_path" -type f | wc -l)
  8 
  9 
 10 echo "在路径$directory_path下的文件个数是: $file_count"   

3.png

解释一下最关键的 -type f


  • -type: 用于指定要查找的文件类型。


  • f: 表示普通文件。这包括文本文件、二进制文件等,但不包括目录、设备文件、符号链接等其他类型的文件。


find 是一个在Unix和类Unix系统中用于在目录树中查找文件和目录的强大命令。它能够根据各种条件搜索文件,并执行相应的操作。


find 命令的基本语法如下:


bash


find [起始目录] [匹配条件] [执行操作]


  • 按文件名搜索:


find /path/to/search -name "filename"


2.


set

4.png

env

5.png

如何设置环境变量呢?


export

6.png

4.


单引号(')


单引号用于创建字面量字符串,其中的内容被视为精确的文本。在单引号内部,特殊字符(比如变量、通配符和命令替换)通常不会被解释或扩展。例如:


echo 'Hello, $USER'


在这个例子中,$USER 不会被解释为当前用户,而是作为普通字符串输出。

7.png

双引号(")


双引号用于创建字符串,并允许解释其中的变量和特殊字符。在双引号内,变量会被替换为其值,而特殊字符会被扩展。例如


greeting="Hello, $USER";echo "$greeting"


在这里,$USER 被解释为当前的用户名,并被替换成实际的用户名。

8.png

在这里$USER会变成用户的名字,所以是root


反引号(`)


反引号用于执行命令替换,将命令的输出结果赋值给变量。例如:


current_date=`date` echo "今天是:$current_date"


在这个例子中,date 命令的输出被赋值给 current_date 变量。


需要注意的是,反引号在较新的Shell版本中逐渐被 $() 替代,功能相似但更易读且嵌套更方便:

9.png

5.

#!/bin/bash
directory_path="/path/to/your/directory"
# 获取目录中的所有文件
files=("$directory_path"/*)
# 删除前10个文件
for ((i=0; i<10 && i<${#files[@]}; i++)); do
    rm "${files[$i]}"
    echo "已删除文件:${files[$i]}"
done
echo "成功删除 $i 个文件。"

6.

 2 #定义存储联系人的数组
  3 contacts=()
  4 
  5 #使用while循环添加联系人
  6 while true; do
  7   read -p "请输入联系人姓名(输入exit结束) : " name
  8 
  9   if [ "$name" == "exit" ]; then
 10      break
 11   fi
 12 
 13   read -p "请输入联系人电话: " phone
 14 
 15   #将联系人信息添加到数组中
 16   contact="姓名: $name,电话: $phone"
 17   contacts+=("$contact")
 18 
 19 done
 20 
 21 echo "通讯录: "
 22 for contact in "${contacts[@]}"; do
 23     echo "$contact"
 24 done               

1.#!/bin/bash: 这是 shebang 行,指定了脚本使用的解释器。#!/bin/bash 表示脚本将由 Bash 解释器执行。


2.contacts=(): 这行创建了一个名为 contacts 的空数组。这是 Bash 中定义数组的方式。


3.while true; do ... done: 这是一个无限循环的开始。while true 会一直循环执行,因为条件始终为真。循环中的命令将一直执行,直到遇到 break 为止。


4.read -p "请输入联系人姓名(输入exit结束添加): " name: read 命令用于从标准输入读取用户输入,并将其存储在变量中。-p 选项用于在用户输入前显示提示消息。在这里,用户输入的姓名将被存储在 $name 变量中。


5.if [ "$name" == "exit" ]; then break; fi: 这是一个条件语句,使用 if 进行条件判断。[ "$name" == "exit" ] 检查变量 $name 是否等于 "exit"。如果是,就执行 break 命令退出循环。


6.read -p "请输入联系人电话: " phone: 类似于前面的 read 命令,用于接收用户输入的电话号码,并将其存储在 $phone 变量中。


7.contact="姓名: $name, 电话: $phone": 这行创建了一个字符串变量 contact,其中包含联系人姓名和电话信息。这里使用了变量替换,将 $name 和 $phone 的值嵌入到字符串中。


8.contacts+=("$contact"): 这是将字符串 $contact 添加到数组 contacts 的语法。+= 表示追加。


9.echo "通讯录:": echo 命令用于打印文本到标准输出。在这里,它打印了通讯录的标题。


10.for contact in "${contacts[@]}"; do echo "$contact"; done: 这是一个 for 循环,用于遍历数组 contacts 中的每个元素。${contacts[@]} 表示整个数组。循环中的命令 echo "$contact" 打印每个联系人的信息。

10.png

7.

#!/bin/bash
# 获取目标目录
target_directory="$1"
# 遍历输入参数中的文件,并将其复制到目标目录
for file in "${@:2}"; do
    # 检查文件是否存在
    if [ -e "$file" ]; then
        # 复制文件到目标目录
        cp "$file" "$target_directory/"
        echo "已复制文件 '$file' 到目录 '$target_directory/'"
    else
        echo "警告: 文件 '$file' 不存在,跳过该文件"
    fi
done
echo "复制完成"

./copy_files.sh /目标目录 文件1 文件2 文件3

 

8.

#!/bin/bash
# 定义包含10个城市名称的数组
cities=("城市1" "城市2" "城市3" "城市4" "城市5" "城市6" "城市7" "城市8" "城市9" "城市10")
# 遍历数组并打印每个城市名称
for city in "${cities[@]}"; do
    echo "$city"
done

11.png

9.


该脚本动态构建一个包含从命令行参数的数量递减到 1 的数字序列的 echo 命令,并通过 eval 命令执行这个构建的 echo 命令,从而实现以逆序打印数字。


10.

#!/bin/bash
# 接收用户输入的字符串
read -p "请输入字符串: " input_string
# 接收用户输入的n和m
read -p "请输入要提取的起始位置n: " n
read -p "请输入要提取的结束位置m: " m
# 使用cut命令提取子串
result=$(echo "$input_string" | cut -c $n-$m)
# 显示提取的子串
echo "提取的子串为: $result"

cut的用法:


其中 OPTION 是一些选项,FILE 是输入文件的名称。如果没有指定文件,则 cut 从标准输入读取数据。


以下是一些常用的 cut 命令选项:


-c, --characters=LIST:指定要剪切的字符范围。例如,-c 1-5 表示剪切第1到第5个字符。


-f, --fields=LIST:指定要剪切的字段范围,字段以制表符或空格分隔。例如,-f 2,4 表示剪切第2和第4个字段。


-d, --delimiter=DELIM:指定字段分隔符,默认为制表符。


--complement:补集,表示不剪切指定的部分,而是保留其他部分。


--output-delimiter=STRING:指定输出时使用的分隔符。

12.png

实验题:

#!/bin/bash
# Function to draw the progress bar
drawProgressBar() {
    local progress=$1
    local total=$2
    local bar_length=50
    local filled_length=$((progress * bar_length / total))
    local empty_length=$((bar_length - filled_length))
    # Create the progress bar string
    local progress_bar=$(printf "[%s%s]" $(printf "#%.0s" $(seq 1 $filled_length)) $(printf " %.0s" $(seq 1 $empty_length)))
    # Print the progress bar
    printf "\r%s %d%%" "$progress_bar" $((progress * 100 / total))
}
# Example usage
total_steps=100
for ((i=1; i<=total_steps; i++)); do
    # Perform some task here
    sleep 0.1
    # Update the progress bar
    drawProgressBar $i $total_steps
done
# Print a newline to separate the progress bar from the next command prompt
echo

13.png

相关文章
|
1月前
|
Web App开发 Java Linux
Linux之Shell基本命令篇
Linux之Shell基本命令篇
Linux之Shell基本命令篇
|
1月前
|
Shell Linux UED
|
2月前
|
Unix Linux Shell
【Shell 编程指南 日期命令】Date命令:显示与设置系统时间和日期
【Shell 编程指南 日期命令】Date命令:显示与设置系统时间和日期
57 0
|
2月前
|
安全 Shell Linux
【Shell 命令集合 系统管理 】Linux 锁定终端 vlock命令 使用指南
【Shell 命令集合 系统管理 】Linux 锁定终端 vlock命令 使用指南
37 1
|
2月前
|
缓存 Shell Linux
【Shell 命令集合 链接器(linker)工具】Linux ld命令 将目标文件与库链接为可执行文件或库文件
【Shell 命令集合 链接器(linker)工具】Linux ld命令 将目标文件与库链接为可执行文件或库文件
46 0
|
2月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示当前登录到系统的用户信息 who命令 使用指南
145 45
|
2月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】Linux 显示目前登入系统的用户信息 w命令 使用指南
【Shell 命令集合 系统管理 】Linux 显示目前登入系统的用户信息 w命令 使用指南
48 2
|
5天前
|
Shell 程序员 数据安全/隐私保护
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
|
17天前
|
网络协议 Unix Shell
第十一章 Shell常用命令与工具(二)
第十一章 Shell常用命令与工具(二)
|
17天前
|
移动开发 Shell Linux
第十一章 Shell常用命令与工具(一)
第十一章 Shell常用命令与工具(一)