我试图在bash中设置一个变量:
b=$(p | cut -d',' -f4)
echo $b
但是,我最终还是坚持:
p: command not found
我已经尝试了括号,大括号和美元符号的每种组合,但仍然无法使b
等于$p | cut -d',' -f4
。根据我的理解,美元符号将从变量中提取值,括号用于表达包含。是否有基本的bash语法,我不知道?
答案 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将变量值扩展为p
到cut
,而不是使用管道(|
)来管理新的子shell(避免使用新的过程开销)。 <<<
具体bash
,POSIX
shell sh
中无法使用。
b=$(cut -d',' -f4 <<<"$p")
echo "$b"
同时双引号变量以避免shell分词。
答案 3 :(得分:0)
如果p是变量,那么试试这个:
b=$(echo "$p" | cut -d',' -f4)
echo $b