Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux “为什么?”;让我们;有时在运行bash-e时退出?_Linux_Bash - Fatal编程技术网

Linux “为什么?”;让我们;有时在运行bash-e时退出?

Linux “为什么?”;让我们;有时在运行bash-e时退出?,linux,bash,Linux,Bash,a.sh的内容是 echo start let index=(RANDOM % 4) echo $index a、 sh有时无法生成数字 gqqnbig@instance-1:~/test/systemd$ vim a.sh gqqnbig@instance-1:~/test/systemd$ bash -e a.sh start 3 gqqnbig@instance-1:~/test/systemd$ bash -e a.sh start 3 gqqnbig@instance-1:~/tes

a.sh的内容是

echo start
let index=(RANDOM % 4)
echo $index
a、 sh有时无法生成数字

gqqnbig@instance-1:~/test/systemd$ vim a.sh
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
3
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
3
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
2
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
2
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
2
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
3
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
3
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
gqqnbig@instance-1:~/test/systemd$ echo $?
1
gqqnbig@instance-1:~/test/systemd$
请参阅上次我运行a.sh时,它只输出“start”,而不输出索引,这意味着
let index=(随机%4)
有错误,退出代码为1


为什么随机变量会产生这种随机误差?如何修复它?

使用
-e
会导致
bash
在出现错误时终止

let
的计算结果为
0
时,它被视为错误。Bash将在打印值
0
之前终止脚本


为避免意外终止,您可以使用以下方法之一:

  • 不要使用
    -e
    标志

  • 确保语句始终成功:

  • 避免使用
    let
    (根据@LéaGris):

  • 如果使用
    let index=($RANDOM%4)
    ,会发生什么情况?不管怎样,我观察到这两种组合都有相同的行为。一个简单的触发测试:{1..10}中i的
    ;do{let test=($RANDOM%4)和&echo$test;}| | break;完成
    。它将尝试10次(在我的例子中足够失败),在第一次失败时中断。如果使用传统的算术扩展而不是
    的话,它不会失败。让
    @Oppen你读了发布的答案了吗?请参阅中的练习,关于
    bash-e
    使你的代码不那么可预测,不那么可移植,更依赖于上下文,更难可靠地检查。为了保护算术表达式不返回失败,请改用以下形式:
    bash-ec'表示{1..10}中的i;do{test=$((随机%4));echo$test;}| | break;“完成”
    我未能说明我理解
    -e
    标志的含义,但我无权删除此标志。这是GitHub操作中的默认标志,它们这样做是有原因的。但是非常感谢您对
    let
    的解释。
    let 'index=(RANDOM % 4)' || true
    
    let 'index=(RANDOM % 4)' || :
    
    index=$((RANDOM % 4))