我的终端中有一个奇怪的行为。
以下命令不会向我的终端打印任何内容:
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 终端都尝试过,但行为相同。
谢谢
这是我的 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 脚本在计算较大数字的阶乘时通常会中断,但就我可以在线挖掘而言,这些负值似乎并不常见。如果有人可以解释其原因,它将对我的学习有很大帮助。谢谢!
例如,inrm -r abc* "*"表示任何字符串。但是,如果我们使用它touch abc* abcd* abcde*(并且目录中没有任何以 abc 或 abcd 或 abcde 开头的文件)"*"意味着只是一个符号,并且abc* abcd* abcde*将创建文件。如果在那之后我们将使用touch -m ab*的文件的修改时间abc* abcd* abcde*将会改变。
为什么在某些情况下"*"意味着任何字符串,而在某些情况下它只是一个符号?计算机如何知道何时更改其含义?
我在 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 脚本来检查命令行中的输入数字是否为 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)