一些实用的shell脚本

记录分享一些自己在linux下常用的shell脚本和小软件。

记录分享一些自己在linux下常用的shell脚本和小软件。

脚本建议使用方式:新建一个储存脚本的目录如~/script,把脚本复制为相应文件,chmod +x 使脚本可执行,然后添加到PATH中方便使用。

1
2
3
4
5
6
7
8
mkdir ~/script

# add scripts
chmod +x ~/script/*

# add to PATH
echo 'export PATH=$PATH:~/script' >> ~/.bashrc
source ~/.bashrc

脚本

无root使用yum安装包

参考: https://blog.csdn.net/GreenHandCGL/article/details/83055151

现在很多服务器都是centos系统,可以用yum( Yellow dog Updater, Modified)作为Shell 前端软件包管理器。

而我们使用服务器的时候通常无法获得root权限,也就无法使用sudo提升权限直接用yum安装软件。 但是其实在linux中,安装软件需要权限通常是因为我们对安装位置没有权限,所以只要把软件安装到我们有权限的位置就行了。

脚本,保存为yum_i

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/bash

# Function to show usage
show_usage() {
    echo "Usage: $0 [-y] package_name"
    exit 1
}

# Check if at least one argument is provided
if [ "$#" -lt 1 ]; then
    show_usage
fi

# Parse options
DOWNLOAD_AND_INSTALL=false
while getopts ":y" opt; do
    case ${opt} in
        y )
            DOWNLOAD_AND_INSTALL=true
            ;;
        \? )
            show_usage
            ;;
    esac
done
shift $((OPTIND -1))

# Get the package name
PACKAGE_NAME=$1

# If no package name is provided, show usage
if [ -z "$PACKAGE_NAME" ]; then
    show_usage
fi

# Function to check if a command exists
command_exists() {
    command -v "$1" >/dev/null 2>&1
}

# Check if yum and yumdownloader are available
if ! command_exists yum || ! command_exists yumdownloader; then
    echo "yum or yumdownloader command not found. Please make sure they are installed."
    exit 1
fi

# Extract the base package name
BASE_NAME=$(echo "$PACKAGE_NAME" | cut -d. -f1)

# If -y option is provided, download and install the package
if [ "$DOWNLOAD_AND_INSTALL" = true ]; then
    echo "Downloading and installing package: $PACKAGE_NAME"
    cd ~ || exit 1
    yumdownloader "$PACKAGE_NAME"
    RPM_FILE=$(ls "${BASE_NAME}"*.rpm 2>/dev/null)
    if [ -f "$RPM_FILE" ]; then
        rpm2cpio "$RPM_FILE" | cpio -idvm
        rm -f "$RPM_FILE"
        echo "Package $PACKAGE_NAME installed successfully."
    else
        echo "Failed to download package $PACKAGE_NAME."
        exit 1
    fi
else
    # Otherwise, list the package
    yum list "$PACKAGE_NAME"
fi

使用方法:

  1. 查询能装的包:yum_i package_name
1
2
3
4
5
6
7
8
9
$ yum_i graphviz
Loaded plugins: fastestmirror, langpacks, product-id, search-disabled-repos, subscription-manager
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Available Packages
graphviz.i686                                                        2.30.1-22.el7                                                      base
graphviz.x86_64                                                      2.30.1-22.el7                                                      base
  1. 正式下载安装包:yum_i -y package_name
1
2
# 注意用上面查找到的包名替换
yum_i -y graphviz.x86_64
  1. 添加环境变量 这种方法默认安装位置是~/usr/bin/,我们把它添加到PATH中:
1
2
echo 'export PATH=$PATH:~/usr/bin/' >> ~/.bashrc
source ~/.bashrc

这样就可以正常调用该软件包了。

autojump

官网:https://github.com/wting/autojump

Autjump 是一个非常实用的命令行工具,帮助用户快速跳转到常用的目录,尤其适合经常在命令行中导航的用户。以下是一些常见的用法示例:

  1. 快速跳转到包含特定关键字的目录

如果你想跳转到包含关键字 foo 的目录,可以使用:

1
j foo
  1. 跳转到子目录

有时候你可能只想跳转到当前目录的某个子目录,而不想输入完整的路径名称。这时可以使用:

1
jc bar

其中 bar 是子目录的名称。

  1. 使用文件管理器打开目录

你还可以通过 jo 命令来使用系统的文件管理器(如 Mac Finder、Windows Explorer、GNOME Nautilus 等)打开目录,而不是直接跳转:

1
jo music

如果你想打开子目录,也可以使用类似的命令:

1
jco images
  1. 使用多个参数来跳转

假设你的数据库中有以下两个目录:

1
2
30   /home/user/mail/inbox
10   /home/user/work/inbox

默认情况下,使用 j in 会跳转到 /home/user/mail/inbox,因为它的权重更高。但是,如果你想跳转到另一个目录,可以通过传递多个参数来实现:

1
j w in

这会跳转到 /home/user/work/inbox

  1. 获取更多选项

如果你想了解更多使用选项,可以查看帮助文档:

1
autojump --help

通过这些命令可以更高效地在系统目录中导航,节省大量时间。

查找差集

使用awk查找file1中存在但file2中不存在的行,并将结果打印到标准输出,有时候在做文件名对比之类时很有用:

脚本,保存为diff_rows

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

# 初始化变量
file1=""
file2=""

# 使用getopts解析命令行参数
while getopts ":f:s:" opt; do
  case "$opt" in
    f)
      file1="$OPTARG"
      ;;
    s)
      file2="$OPTARG"
      ;;
    \?)
      echo "无效的选项: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "选项 -$OPTARG 需要一个参数" >&2
      exit 1
      ;;
  esac
done

# 检查必需的参数是否提供
if [ -z "$file1" ] || [ -z "$file2" ]; then
  echo "用法: $0 -f <file1> -s <file2>"
  exit 1
fi

awk 'NR==FNR{seen[$0]=1; next} !seen[$0]' "$file2" "$file1"

文件夹软链接

方便创建多个软链接,将源目录中的所有文件链接到目标目录中:

脚本,保存为link_dir

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash

# 检查是否提供了源目录和目标目录
if [ $# -ne 2 ]; then
  echo "Usage: $0 <source_directory> <destination_directory>"
  exit 1
fi

SOURCE_DIR=$1
DEST_DIR=$2

# 检查源目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
  echo "Source directory does not exist."
  exit 1
fi

# 检查目标目录是否存在,不存在则创建
if [ ! -d "$DEST_DIR" ]; then
  echo "Destination directory does not exist. Creating it now."
  mkdir -p "$DEST_DIR"
fi

# 创建软链接
for file in "$SOURCE_DIR"/*; do
  ln -s "$file" "$DEST_DIR"
done

echo "Soft links created for all files in $SOURCE_DIR to $DEST_DIR"
Licensed under CC BY-NC-SA 4.0
Email: pengchen2001@zju.edu.cn
Built with Hugo
Theme Stack designed by Jimmy