几个shell编程的小例子

2023-08-08 09:48:55 浏览数 (1)

1 遍历文件系统

可以使用Shell脚本中的循环结构和相关的命令来完成。

下面是一个简单的例子,展示如何使用Shell脚本来完成一次文件系统的遍历。

代码语言:shell复制
#!/bin/bash

# 定义一个函数来遍历文件和目录
traverse() {
  local path="$1"
  local indent="${2:-0}"   # 缩进的级别,默认为0
  local item

  # 使用命令`ls "$path"`来获取指定路径下的所有文件和目录
  # 使用循环遍历每一个文件和目录
  for item in $(ls "$path")
  do
    # 构建当前文件或目录的完整路径
    local fullpath="${path}/${item}"

    # 打印缩进和文件名
    # 使用`printf`命令和`%*s`格式来实现缩进
    printf "%${indent}s%sn" "" "$item"

    # 如果当前路径是一个目录,则递归调用traverse函数来遍历子目录
    if [[ -d "$fullpath" ]]
    then
        # 递归调用traverse函数,并增加缩进级别
        traverse "$fullpath" $((indent 2))
    fi
  done
}

# 调用traverse函数,并传入待遍历的路径作为参数
traverse "/path/to/yifan-online"

运行以上脚本,将会遍历指定路径下的文件和子目录,并打印出文件系统的结构,例如:

代码语言:txt复制
directory1
  file1.txt
  file2.txt
  subdirectory1
    file3.txt
  subdirectory2
directory2
  file4.txt

在上面的例子中,我们先定义了一个名为traverse的函数,用于递归地遍历文件和目录。我们使用ls命令获取指定路径下的所有文件和目录,并在循环中处理每一个文件和目录。如果某个文件是一个目录,则会递归调用traverse函数来遍历子目录。在打印文件和目录时,我们根据不同的缩进级别使用printf命令实现缩进效果。最后,我们调用traverse函数并传入待遍历的路径作为参数,即可开始文件系统的遍历。

2 确认一个给定的字符串是否存在于一个文本文件中?

代码语言:shell复制
#!/bin/bash

# 获取用户输入的字符串
read -p "请输入要查找的字符串:" search_string

# 获取用户输入的文件路径
read -p "请输入要搜索的文件路径:" file_path

# 判断文件是否存在
if [ ! -f $file_path ]; then
    echo "文件不存在,请重新输入正确的文件路径"
    exit 1
fi

# 在文件中查找字符串,并打印结果
if grep -q "$search_string" "$file_path"; then
    echo "字符串存在于文件中"
else
    echo "字符串不存在于文件中"
fi

调试方法:

  1. 在脚本文件的开头添加 set -x 行,该命令会将运行的每一行都打印出来,方便找出问题所在。脚本开头的代码如下所示:
代码语言:shell复制
#!/bin/bash
set -x
  1. 给脚本文件添加执行权限:chmod x script.sh
  2. 运行脚本文件:./script.sh

执行上述操作后,脚本将会按行显示每一行的执行过程,包括变量的赋值、命令的执行等。如果在执行过程中出现了错误,可以根据输出的信息定位问题所在。

参考输出结果:

代码语言:shell复制
请输入要查找的字符串:hello
请输入要搜索的文件路径:/path/to/file.txt
  '[' '!' -f /path/to/file.txt ']'
  grep -q hello /path/to/file.txt
  echo '字符串不存在于文件中'
字符串不存在于文件中

注:

  • 如果字符串存在于文件中,输出结果为 "字符串存在于文件中",否则为 "字符串不存在于文件中"。
  • 脚本假设用户输入的文件路径是正确的,如果文件不存在,则会提示用户重新输入正确的文件路径,并退出脚本。

3 使用循环读取某个目录下的所有文件的行数,并总计行数

代码语言:shell复制
#!/bin/bash

# 定义一个变量来存储总行数
total_lines=0

# 设置要统计行数的目录
dir="/path/to/directory"

# 循环遍历目录下的所有文件
for file in $(find $dir -type f); do
    # 统计当前文件的行数
    lines=$(cat $file | wc -l)
    # 累加到总行数中
    total_lines=$((total_lines   lines))
    # 输出当前文件的行数
    echo "$file: $lines"
done

# 输出总行数
echo "Total lines: $total_lines"

使用该脚本,将/path/to/directory替换为你要统计的目录的路径。运行该脚本后,将会输出每个文件的行数,并最后输出总行数。

4 处理多种可能的输出

处理多种可能的输出通常可以通过以下几种方式:

  1. 使用条件判断语句:使用if-else语句或者case语句来判断输出的不同情况,并执行相应的操作。具体示例代码如下:
代码语言:shell复制
output=$(command)
if [[ "$output" == "case1" ]]; then
    # 处理case1的输出
elif [[ "$output" == "case2" ]]; then
    # 处理case2的输出
else
    # 处理其他情况的输出
fi
  1. 使用正则表达式匹配:如果输出存在多种可能的模式,可以使用正则表达式来匹配不同的模式,并执行相应的操作。具体示例代码如下:
代码语言:shell复制
output=$(command)
if [[ "$output" =~ regex1 ]]; then
    # 处理regex1匹配的输出
elif [[ "$output" =~ regex2 ]]; then
    # 处理regex2匹配的输出
else
    # 处理其他情况的输出
fi
  1. 使用命令的退出码:有些命令会返回不同的退出码来表示不同的情况,可以通过检查命令的退出码来处理不同的输出情况。具体示例代码如下:
代码语言:shell复制
command
if [[ $? -eq 0 ]]; then
    # 处理命令执行成功的输出
else
    # 处理命令执行失败的输出
fi

以上是处理多种可能输出的一些常见方法,在实际编写Shell脚本时,需要根据具体的情况选择合适的方法来处理输出。

5 实现多条件判断

在Shell脚本中,可以使用if语句来实现多条件判断。

语法如下:

代码语言:txt复制
if condition1; then
    # 代码块1
elif condition2; then
    # 代码块2
elif condition3; then
    # 代码块3
else
    # 默认代码块(可选)
fi

其中,condition1condition2condition3是要判断的条件,可以是比较表达式、逻辑表达式等。如果condition1为真,则执行代码块1;如果condition1为假,并且condition2为真,则执行代码块2;以此类推。最后,如果所有条件都为假,则可以选择执行默认代码块(可选)。

以下是一个例子:

代码语言:shell复制
#!/bin/bash

read -p "请输入一个整数: " num

if ((num % 2 == 0)); then
    echo "这是一个偶数"
elif ((num % 2 == 1)); then
    echo "这是一个奇数"
else
    echo "无效输入"
fi

运行脚本时,根据输入的整数判断是奇数还是偶数,并进行相应的输出。

示例运行结果:

代码语言:txt复制
请输入一个整数: 5
这是一个奇数

请输入一个整数: 10
这是一个偶数

请输入一个整数: abc
无效输入

0 人点赞