假设我想比较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
需要整数。那么,有没有其他方法可以比较版本?
我按照这里的教程学习如何使用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) 我创建了自己的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) 我只想获取已安装文件系统的总大小。但问题是我只知道挂载点。所以,我想到了使用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
但在这里没有用,因为我不知道字符串和整数之间的空格。有没有办法在终端上打印这个尺寸?
我执行了以下行:
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
在其他人的系统上尝试了上述命令,它运行良好,没有产生我得到的错误。
程序片段:
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)
我知道我写的echo
是wrong
. 但是有没有办法双重替换变量。否则我将不得不写很多 …
问题陈述:我想在单行命令中从给定的路径名中提取一个未知字符串(最后一个字符串)。
限制:
样本:
例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
命令,但它不起作用,因为路径长度是动态的。
我有一个编译程序的脚本。该程序首先使用configure && make
命令编译源代码,然后使用make test
. 此脚本还用于set -e
捕获错误。
现在,我想要做的是set -e
在脚本中保持设置,并在make test
遇到一些错误时仍然继续运行脚本。make -k test
即使遇到错误,我也尝试使用它来运行测试,但它被set -e
命令捕获并停止。
我也知道哪些测试会失败,所以有什么方法可以告诉脚本跳过捕捉这些错误。
shell-script ×5
bash ×3
command-line ×1
cut ×1
disk-usage ×1
getopts ×1
grep ×1
grub2 ×1
numeric-data ×1
shell ×1
test ×1
version ×1