(在 initramfs 内部)的一个古老版本ipconfig
要求其用户输入最多只能提供 7 个冒号分隔的元素,例如:
ip=client-ip:server-ip:gw-ip:netmask:hostname:device:autoconf
ipconfig
当用户确实提供超过 7 个元素时会导致错误。
因此额外的(2个DNS解析器)应该被砍掉。
这可以在subshell
with中完成cut
,例如:
validated_input=$(echo ${user_input} | cut -f1,2,3,4,5,6,7 -d:)
如何使用参数扩展/替换cut
来编写这样的内容?(b)ash
没有:
- 启动子外壳/子进程(管道)
- IFS-wrangling/mangling
由于 (1) 速度,请参阅使用 bash 变量替换而不是 cut/awk和 (2) 学习。
换句话说:如何查找第 n 个(第 7 个)字符的出现并从那里删除/修剪所有内容,直到字符串结尾?
使用正则表达式:
这应该在标准外壳中工作:
或者,如果我们确实允许设置
IFS
持续时间read
:这仅使用参数扩展:
示例:
感谢 ilkkachu 提出了对尾随的修复
:
!这将尝试匹配参数的开头,如果匹配,它将删除它。
示例:
这将尝试匹配参数的结尾,如果匹配,它将删除它。
示例:
所以在答案中:
(注意周围的引号,
${var#...}
以便将其视为要从 末尾剥离的文字字符串(而不是模式$var
)。应用于:
${var#*:*:*:*:*:*:*:}
=morefields:another:youwantanother:haveanother:
内部扩展
${var%: ... }
如下:${var%:morefields:another:youwantanother:haveanother:}
所以你说给我:
但
:morefields:another:youwantanother:haveanother:
剪掉末端。Bash 参考手册 ( 3.5.3 )
在
zsh
:${(s(:))var}
分开:
"${(@)...}"
: 确保保留空元素(如 in"$@"
)${var[1,7]}
元素 1 到 7${(j(:))var}
加入元素:
或者你可以这样做:
${var##pattern}
就像在 ksh 中一样,去掉与模式匹配的最长前导部分。(M)
: 扩展到M匹配部分而不是剥离它x#
: 0 或多个x
s (如 regexp*
)(#c0,6)
从前一个原子的 0 到 6(如 ksh's{x,y}(...)
)