小编ImH*_*ere的帖子

grep 在 bash 脚本中工作,但在终端中不起作用

我的终端中有一个奇怪的行为。

以下命令不会向我的终端打印任何内容:

comment=$(
    cat /usr/share/applications/brasero.desktop | 
    grep '^Comment=' |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment
Run Code Online (Sandbox Code Playgroud)

完全相同的命令,相同的语法在 bash 脚本中完美运行。

通常,我看到人们抱怨相反的行为。

我知道上述操作可以通过数百种方式完成,但我不明白为什么上述命令在我的终端中没有运行。

另一方面,这些命令在终端和脚本中都可以正常工作:

comment=$(
    cat /usr/share/applications/brasero.desktop |
    grep -Po '(?<=^Comment=)[ --0-9A-Za-z/.]*'
)
echo $comment

grep -Po '(?<=Exec=)[ --0-9A-Za-z/:space:]*' > /usr/share/applications/brasero.desktop
Run Code Online (Sandbox Code Playgroud)

我在 Debian 8 Sid 下使用 GNU bash,版本 4.4.0(1)-release (x86_64-pc-linux-gnu),grep (GNU grep) 2.26。我在 xfce 和 mate 终端都尝试过,但行为相同。

谢谢

grep bash terminal

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

某些数字的因子产生负值

这是我的 bash 脚本计算阶乘的代码

read -p "Please enter the number " number
while ([ $number -gt 0 ])
do
   factorial=1
   for ((i=$number;i > 0;i--))
   do
       factorial=$((factorial * $i))
   done
   echo "The factorial of the " $number " is " $factorial
   number=$((number - 1))
done
Run Code Online (Sandbox Code Playgroud)

这将打印出从 {input:1} 范围内的所有数字的阶乘,除了少数的阶乘之外,一切看起来都正确。输出如下。 计算阶乘的代码输出

如您所见,某些数字的阶乘是负值。我从在线论坛了解到 bash 脚本在计算较大数字的阶乘时通常会中断,但就我可以在线挖掘而言,这些负值似乎并不常见。如果有人可以解释其原因,它将对我的学习有很大帮助。谢谢!

linux bash shell-script

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

为什么“*”在不同命令中的作用不同?

例如,inrm -r abc* "*"表示任何字符串。但是,如果我们使用它touch abc* abcd* abcde*(并且目录中没有任何以 abc 或 abcd 或 abcde 开头的文件)"*"意味着只是一个符号,并且abc* abcd* abcde*将创建文件。如果在那之后我们将使用touch -m ab*的文件的修改时间abc* abcd* abcde*将会改变。

为什么在某些情况下"*"意味着任何字符串,而在某些情况下它只是一个符号?计算机如何知道何时更改其含义?

shell bash command touch

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

在 bash 中:变量替换中的尾随空格捕获

我在 BASH 4.3.48 (SLES12 SP4) 和 BASH 4.4.23 (OpenSUSE Leap 15.1) 中尝试从变量值中删除多个尾随空格时看到了这一点:

~> xxx="-O -Wall  "
~> echo "X${xxx%% }X"    # (1)
X-O -Wall X
~> echo "X${xxx%% *}X"
X-OX
~> echo "X${xxx% }X"
X-O -Wall X
~> echo "X${xxx% *}X"    # (2)
X-O -Wall X
~> echo "X${xxx%% \*}X"
X-O -Wall  X
Run Code Online (Sandbox Code Playgroud)

我觉得要么(1)或者(2)应该做这份工作。

手册规定${parameter%%word}

删除匹配的后缀模式。这个词被扩展以产生一个模式,就像在路径名扩展中一样。如果模式匹配参数扩展值的尾随部分,则扩展的结果是具有最短匹配模式(“%”情况)或最长匹配模式(“%”)的参数扩展值%'' 大小写)已删除。

由于它不像文档那样工作(或者我理解文档),我怀疑这是一个错误(在 BASH 的-Wall情况下,将删除不匹配的后缀(“ ”)%% *。我对吗?

bash variable-substitution

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

检查命令行中的数字是否为 2 的幂

我无法制作一个 bash 脚本来检查命令行中的输入数字是否为 2 的幂

输入

# ./pow2script.sh xyzdf 4 8 12 -2 USAD
Run Code Online (Sandbox Code Playgroud)

期望的输出:期望的输出应该在单独的行上

4
8
Run Code Online (Sandbox Code Playgroud)

因为只有 4 是 2^2 而 8 是 2^3

pow2script.sh 的内容

#!/bin/bash

function is_power_of_two () {
    declare -i n=$1
    (( n > 0 && (n & (n - 1)) == 0 ))
}

for number; do
    if is_power_of_two "$number"; then
        printf "%d\n" "$number"
    fi
done
Run Code Online (Sandbox Code Playgroud)

scripting bash

-5
推荐指数
2
解决办法
4960
查看次数