Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
在bash中添加和划分变量。错误:TEST3=:未找到命令_Bash_Variables_Disk - Fatal编程技术网

在bash中添加和划分变量。错误:TEST3=:未找到命令

在bash中添加和划分变量。错误:TEST3=:未找到命令,bash,variables,disk,Bash,Variables,Disk,因此,我正在制作一个程序,使用dd命令测试硬盘驱动器的平均读/写速度,我的代码如下(bash): 上述代码返回以下错误(在dd输出之间): TEST1=:未找到命令 TEST2=:未找到命令 TEST3=:未找到命令 请帮忙(信不信由你)这是一个学校项目 编辑:我知道我的变量没有有效的名称。但是我想知道是否有一种方法可以在没有这个狗屎的情况下做到这一点:“^$({$-%})$”正则表达式?有没有办法不这样做呢?你(至少)有两个问题 TEST$i=…不是变量赋值的有效bash语法。如果命令行中的第

因此,我正在制作一个程序,使用dd命令测试硬盘驱动器的平均读/写速度,我的代码如下(bash):

上述代码返回以下错误(在dd输出之间): TEST1=:未找到命令 TEST2=:未找到命令 TEST3=:未找到命令

请帮忙(信不信由你)这是一个学校项目 编辑:我知道我的变量没有有效的名称。但是我想知道是否有一种方法可以在没有这个狗屎的情况下做到这一点:“^$({$-%})$”正则表达式?有没有办法不这样做呢?

你(至少)有两个问题

  • TEST$i=…
    不是变量赋值的有效bash语法。如果命令行中的第一个“单词”不是有效的赋值,那么它将被视为命令名。因此
    bash
    继续,用
    $i
    的值替换
    $i
    ,用
    dd
    命令的输出替换
    $(dd…
    (见下文),最后是连续的“命令”
    TEST1=
    TEST2=
    TEST3=
    。这些都是未知的命令,所以它抱怨道

    在赋值中,
    =
    前面只能放字母、数字和
    (除非是数组赋值),这意味着不能使用参数替换来创建变量名。(但您可以使用数组。)

  • 您似乎假设
    dd
    命令将输出所花费的时间量,或者类似的内容。没有。事实上,它不会在标准输出上输出任何内容。它将在
    stderr
    上输出几行,但是
    stderr
    不会被
    $(…)
    捕获

  • 你(至少)有两个问题

  • TEST$i=…
    不是变量赋值的有效bash语法。如果命令行中的第一个“单词”不是有效的赋值,那么它将被视为命令名。因此
    bash
    继续,用
    $i
    的值替换
    $i
    ,用
    dd
    命令的输出替换
    $(dd…
    (见下文),最后是连续的“命令”
    TEST1=
    TEST2=
    TEST3=
    。这些都是未知的命令,所以它抱怨道

    在赋值中,
    =
    前面只能放字母、数字和
    (除非是数组赋值),这意味着不能使用参数替换来创建变量名。(但您可以使用数组。)

  • 您似乎假设
    dd
    命令将输出所花费的时间量,或者类似的内容。没有。事实上,它不会在标准输出上输出任何内容。它将在
    stderr
    上输出几行,但是
    stderr
    不会被
    $(…)
    捕获


  • 第一个问题:如果不跳过一些特殊的跃点,就不能使用根据其他变量定义的变量名(
    TEST$i=…
    )。有几种方法可以解决这个问题。您可以使用
    declare
    命令(
    declare TEST$i=…
    ),或者使用数组(
    TEST[i]=…
    ),然后使用例如
    RESULT=$((TEST[1]+TEST[2])
    ),或者我建议的方法:在不使用编号的TEST1等变量的情况下累积时间:

    numval=3
    
    result=0
    for i in `seq 1 $numval`; do
        test=$(dd if=/dev/zero of=speedtest bs=1M count=100 conv=fdatasync)
        result=$((result + test))
    done
    
    result=$((result / numval))
    
    (请注意,我更喜欢在shell脚本中使用小写变量名,以避免意外使用shell的预定义变量之一并造成混乱。此外,在
    $(())
    内部,变量会自动替换,因此不需要
    $

    但是,这仍然不起作用,因为

    第二个问题:
    dd
    没有输出数字。事实上,它不会将任何内容输出到标准输出(标准输出是
    $()
    捕获的)。它所做的是将一组数字和其他类似的东西输出到标准误差。您的
    dd
    版本与我的稍有不同,但其stderr输出可能如下所示:

    $ dd if=/dev/zero of=/dev/null bs=1m count=100
    100+0 records in
    100+0 records out
    104857600 bytes transferred in 0.011789 secs (8894645697 bytes/sec)
    
    。。。您可能想要选择字节/秒的数字。根据
    dd
    的确切输出,类似的方法可能会起作用:

    $ dd if=/dev/zero of=/dev/null bs=1m count=100 2>&1 | sed -n 's/^.*(\([0-9]*\) bytes.*$/\1/p'
    8746239457
    
    这样做的目的是将
    dd的
    错误输出重定向到标准输出(
    2>&1
    ),然后通过管道(
    |
    )将其重定向到一个有点凌乱的
    sed
    命令,该命令查找匹配的内容(”,然后是一组数字,然后是“字节”,只输出数字部分

    以下是我最后的完整脚本:

    #!/bin/bash
    numval=3
    
    result=0
    for i in `seq 1 $numval`; do
        test=$(dd if=/dev/zero of=speedtest bs=1M count=100 conv=fdatasync 2>&1 | sed -n 's/^.*(\([0-9]*\) bytes.*$/\1/p')
        result=$((result + test))
    done
    
    result=$((result / numval))
    echo "$result" >Result
    

    第一个问题:如果不跳过一些特殊的跃点,就不能使用根据其他变量定义的变量名(
    TEST$i=…
    )。有几种方法可以解决这个问题。可以使用
    declare
    命令(
    declare TEST$i=…
    ),或者使用数组(
    TEST[i]=…
    ),然后使用例如
    RESULT=$((TEST[1]+TEST[2])
    ),或者我的建议是:在不使用编号的TEST1等变量的情况下累积时间:

    numval=3
    
    result=0
    for i in `seq 1 $numval`; do
        test=$(dd if=/dev/zero of=speedtest bs=1M count=100 conv=fdatasync)
        result=$((result + test))
    done
    
    result=$((result / numval))
    
    (请注意,我更喜欢在shell脚本中使用小写变量名,以避免意外使用shell的预定义变量之一并造成混乱。此外,在
    $(())
    内部,变量会自动替换,因此不需要
    $

    但是,这仍然不起作用,因为

    第二个问题:
    dd
    没有输出数字。事实上,它没有将任何内容输出到标准输出(这是
    $()
    捕获的)。它所做的是将一组数字和其他类似的东西输出到标准错误。您的
    dd
    版本与我的稍有不同,但它的stderr输出可能如下所示:

    $ dd if=/dev/zero of=/dev/null bs=1m count=100
    100+0 records in
    100+0 records out
    104857600 bytes transferred in 0.011789 secs (8894645697 bytes/sec)
    
    …您可能想选择字节/秒数字。根据
    dd
    的确切输出,类似的方法可能会起作用:

    $ dd if=/dev/zero of=/dev/null bs=1m count=100 2>&1 | sed -n 's/^.*(\([0-9]*\) bytes.*$/\1/p'
    8746239457
    
    它的作用是redi