gpt4 book ai didi

python - ZSH 5.05 字符串拆分为空

转载 作者:行者123 更新时间:2023-11-28 22:48:44 24 4
gpt4 key购买 nike

this SO question 所述, ZSH 默认压缩字符串拆分中的相邻分隔符。现在,在 ZSH 5.05 中,提供的修复程序不起作用。

Hexagon% string="1::3"
Hexagon% setopt interactive_comments
Hexagon% a=("${(s/:/)string}") # notice the quotes
Hexagon%
Hexagon% echo $a[1] # 1, good
1
Hexagon% echo $a[2] # nothing, good
3
Hexagon% echo $a[3] # 3, good

如您所见,我的结果与之前 ZSH 上记录的结果不匹配。我如何模拟此功能,更好的是,是否有一种可移植的方式来模拟此功能?

最佳答案

zsh 中尝试以下操作:

IFS=: read -r -A a <<<"$string"
  • -A 将输入读入一个数组,在本例中名为a
  • IFS=:(本地化为命令)将 : 定义为将输入拆分为多个字段的分隔符 - 多个相邻分隔符被视为包围 字段,所以 $a[2] 最终为空。

可移植的方式做到这一点很棘手:

这是一个适用于 zshbashksh 的解决方案——但是它不符合 POSIX(见下文):

# Determine the shell-specific option character for `read`;
# [-]A for ksh and zsh, [-]a for bash:
readIntoArrayOptChar='A' && [[ -n $BASH_VERSION ]] && readIntoArrayOptChar='a'

# Read the input string into array `a`, splitting into elements by ':'
IFS=: read -r -$readIntoArrayOptChar a <<<"$string"

# Determine the shell-specific start and end indices for printing
# the array elements in a loop:
# bash and ksh are 0-based, zsh is 1-based (by default).
startNdx=0 endNdx=${#a[@]}
[[ -n $ZSH_VERSION ]] && (( ++startNdx, ++endNdx ))

# Print array elements individually.
# Note how the element references are enclosed in {...} for cross-shell
# compatibility.
for (( i = startNdx; i < endNdx; i++ )); do
echo "el. $i: ["${a[i]}"]" # -> e.g., in zsh, 1st iteration: 'el. 1: [1]'
done

注意:

  • Python 的 subprocess.call() 参数 shell = Trueos.system() 调用 sh默认情况下,您只能依赖 POSIX 功能(而且,如果平台不是类 Unix,甚至不能依赖它)。
  • 以上内容不符合 POSIX,主要是因为数组变量不是 POSIX shell 语言规范的一部分,正如@rici 指出的那样。
  • @rici 还指出 bash/ksh 构造的 zsh 明显缺失 ${!a[@]} 以获得数组 (a) 的索引列表

关于python - ZSH 5.05 字符串拆分为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24794182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com