小编Abh*_*ran的帖子

如何在shell脚本中比较程序的版本?

假设我想比较gcc版本以查看系统是否安装了最低版本。

为了检查gcc版本,我执行了以下操作

gcc --version | head -n1 | cut -d" " -f4
Run Code Online (Sandbox Code Playgroud)

输出是

4.8.5
Run Code Online (Sandbox Code Playgroud)

所以,我写了一个简单的if语句来检查这个版本与其他一些值

if [ "$(gcc --version | head -n1 | cut -d" " -f4)" -lt 5.0.0 ]; then
    echo "Less than 5.0.0"
else
    echo "Greater than 5.0.0"
fi
Run Code Online (Sandbox Code Playgroud)

但它抛出一个错误:

[: integer expression expected: 4.8.5
Run Code Online (Sandbox Code Playgroud)

我理解我的错误,我使用字符串进行比较并且-lt需要整数。那么,有没有其他方法可以比较版本?

version shell-script test numeric-data

21
推荐指数
2
解决办法
3万
查看次数

在 getopts 中没有指定选项时执行默认选项

我按照这里的教程学习如何使用getopts. 我能够执行用户正确提供的所有选项。但是现在我想在没有提供任何选项时执行默认选项。

例如:

while getopts ":hr" opt; do
    case $opt in
        h )
            show_help;
            exit 1
            ;;
        r )
          echo "Default option executed"
          ;;
    esac
done
Run Code Online (Sandbox Code Playgroud)

因此,如果用户提供-h-r,则应执行相应的命令(实际上确实如此),但是当没有提供这些选项时-r,默认情况下应执行。有没有办法实现这一目标?

更新

我尝试了cas's建议并包含*)在我的getopts功能中,但似乎没有发生任何事情。

while getopts ":hr" opt; do
    case $opt in
        h )
            show_help;
            exit 1
            ;;
        r )
          echo "Default option executed"
          ;;

        \? )
          echo error "Invalid option: -$OPTARG" >&2
          exit 1
          ;;

        : )
          echo …
Run Code Online (Sandbox Code Playgroud)

shell-script getopts

7
推荐指数
2
解决办法
1万
查看次数

有:未找到命令

我创建了自己的linux。每当我打开 bash 并登录到子 shell 时,都会收到以下错误

-bash: have: command not found
-bash: have: command not found
-bash: have: command not found
-bash: have: command not found
-bash: have: command not found
-bash: have: command not found
-bash: have: command not found
Run Code Online (Sandbox Code Playgroud)

它会显示多次。为了调试它,我执行了以下命令:

bash --login -x
Run Code Online (Sandbox Code Playgroud)

输出:

+ source /etc/locale.conf
++ LANG=en_US.UTF-8
+ for f in '/etc/bash_completion.d/*'
+ '[' -e /etc/bash_completion.d/grub ']'
+ source /etc/bash_completion.d/grub
+++ echo grub-set-default
+++ sed s,x,x,
++ __grub_set_default_program=grub-set-default
++ have grub-set-default
bash: have: command not …
Run Code Online (Sandbox Code Playgroud)

bash grub2

5
推荐指数
1
解决办法
7109
查看次数

仅获取已挂载文件系统的大小

我只想获取已安装文件系统的总大小。但问题是我只知道挂载点。所以,我想到了使用df命令。

为了获得这个挂载文件系统的大小,我运行了以下命令:

df --output=target,size | grep -w /mnt/xyz
Run Code Online (Sandbox Code Playgroud)

我得到的结果是这样的:

/mnt/xyz             4339044
Run Code Online (Sandbox Code Playgroud)

我知道如何使用,cut但在这里没有用,因为我不知道字符串和整数之间的空格。有没有办法在终端上打印这个尺寸?

grep bash disk-usage shell-script cut

5
推荐指数
2
解决办法
1万
查看次数

/dev 错误中没有 null

我执行了以下行:

which lsb_release 2&>1 /dev/null
Run Code Online (Sandbox Code Playgroud)

输出:

error: no null in /dev
Run Code Online (Sandbox Code Playgroud)

当我使用ls /dev/null命令验证错误时,null出现在/dev. 为什么会发生此错误?我无法破译这个问题。

更新

我只是which在其他人的系统上尝试了上述命令,它运行良好,没有产生我得到的错误。

command-line shell

5
推荐指数
1
解决办法
646
查看次数

bash中的双变量替换

程序片段:

BASH_MIN_REQ="2.05"
BINUTILS_MIN_REQ="2.12"
BISON_MIN_REQ="1.875"

BASH_CURR=$(bash --version | head -n1 | cut -d"(" -f1 | cut -d" " -f4)
BINUTILS_CURR=$(ld --version | head -n1 | cut -d" " -f7)
BISON_CURR=$(bison --version | head -n1 | cut -d" " -f4)

list=(BASH BINUTILS BISON)

for progs in ${list[@]}; do
    echo "$progs: ${${progs}_MIN_REQ}:${${progs}_CURR}"
done
Run Code Online (Sandbox Code Playgroud)

预期输出:

BASH: 2.05:4.3.11
BINUTILS: 2.12:2.24
BISON: 1.875:3.0.2
Run Code Online (Sandbox Code Playgroud)

注意用值初始化的变量。我想${progs}_MIN_REQ$BASH_MIN_REQ它初始化的值 2.05替换然后再次替换。并在for循环内执行此操作,以便我编写代码更容易,因为我只需要编写 1 条echo语句而不是 3 条语句。

实际输出:

bad substitution
Run Code Online (Sandbox Code Playgroud)

我知道我写的echowrong. 但是有没有办法双重替换变量。否则我将不得不写很多 …

bash variable-substitution

4
推荐指数
1
解决办法
2275
查看次数

从路径中提取字符串

问题陈述:我想在单行命令中从给定的路径名​​中提取一个未知字符串(最后一个字符串)。

限制:

  1. 路径是动态的,可以随着用户输入而改变。
  2. 仅使用一行 o 命令提取最后一个字符串。

样本:

例1:

/home/xyz/Desktop/tools
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只需要提取单词tools.

例2:

/tmp/my_directory/my_big_dir/my_small/dir/cross
Run Code Online (Sandbox Code Playgroud)

再次,我需要提取最后一个字符串 cross

有没有办法做到这一点?

我尝试使用cut命令,但它不起作用,因为路径长度是动态的。

shell-script

3
推荐指数
1
解决办法
3824
查看次数

跳过捕获 shell 脚本中的错误

我有一个编译程序的脚本。该程序首先使用configure && make命令编译源代码,然后使用make test. 此脚本还用于set -e捕获错误。

现在,我想要做的是set -e在脚本中保持设置,并在make test遇到一些错误时仍然继续运行脚本。make -k test即使遇到错误,我也尝试使用它来运行测试,但它被set -e命令捕获并停止。

我也知道哪些测试会失败,所以有什么方法可以告诉脚本跳过捕捉这些错误。

shell-script error-handling

0
推荐指数
1
解决办法
2742
查看次数