无法在Bash中设置变量

时间:2017-01-28 06:48:24

标签: bash

我试图在bash中设置一个变量:

b=$(p | cut -d',' -f4)
echo $b

但是,我最终还是坚持:

p: command not found

我已经尝试了括号,大括号和美元符号的每种组合,但仍然无法使b等于$p | cut -d',' -f4。根据我的理解,美元符号将从变量中提取值,括号用于表达包含。是否有基本的bash语法,我不知道?

4 个答案:

答案 0 :(得分:1)

下面的代码也可以使用,并且可能通过避免调用外部程序cut并仅使用read内置函数来提高性能:

IFS="," read -r dummy dummy dummy b dummy  <<<"$p"
echo "$b"

您还可以收集数组中的所有值,然后再引用它们

IFS="," read -r -a array <<<"$p"
echo "${array[4]}"              # Print 4th field
echo "${#array[@]}"             # Print field count

在所有情况下,IFS=","是告诉read使用逗号作为字段分隔符的方式,-r强制反斜杠按原样使用,而不是解释(例如\n不会被视为换行符,而是视为一个双字符串字符串。)

请注意,上述示例仅处理不包含换行符的字符串。

答案 1 :(得分:1)

如何使用Bash模式?

  • 使用参数扩展(超级便携):

    b=${p#*,*,*,}
    b=${b%%,*}
    
  • 通过拆分以逗号分隔的字符串并仅读取第四个字段(仅限Bash):

    IFS=, read -r -d '' _ _ _ b _ < <(printf '%s,\0' "$p")
    
  • 使用正则表达式(也会提供某种验证,仅限Bash):

    if [[ $p =~ ^[^,]*,[^,]*,[^,]*,([^,]*).*$ ]]; then
        b=${BASH_REMATCH[1]}
    else
        echo >&2 "String doesn't match"
    fi
    
  • 通过将字符串完全拆分为数组(与上面的第2点相同,仅限Bash):

    IFS=, read -r -d '' -a pary < <(printf '%s,\0' "$p")
    b=${pary[3]}
    

答案 2 :(得分:0)

使用here-string将变量值扩展为pcut,而不是使用管道(|)来管理新的子shell(避免使用新的过程开销)。 <<<具体bashPOSIX shell sh中无法使用。

b=$(cut -d',' -f4 <<<"$p")
echo "$b"

同时双引号变量以避免shell分词。

答案 3 :(得分:0)

如果p是变量,那么试试这个:

b=$(echo "$p" | cut -d',' -f4)
echo $b