Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Python ZSH 5.05字符串拆分为空_Python_Bash_Split_Zsh - Fatal编程技术网

Python ZSH 5.05字符串拆分为空

Python ZSH 5.05字符串拆分为空,python,bash,split,zsh,Python,Bash,Split,Zsh,如所述,默认情况下,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 Hexa

如所述,默认情况下,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"
注:

  • Python的
    subprocess.call()
    ,参数为
    shell=True
    os.system()
    invoke
    sh
    ,默认情况下,您只能依赖POSIX功能(如果平台与Unix不同,甚至不能依赖于该功能)
  • 正如@rici所指出的,上述内容不符合POSIX,主要是因为数组变量不是POSIX外壳语言规范的一部分
  • @rici还指出,在
    zsh
    中,bash/ksh构造
    ${!a[@]}
    在获取数组的索引列表(
    a
    )方面明显缺失
在zsh 5.0.2版(大概是更高版本)中,您可以通过添加
@
标志在拆分中保留空字符串:

a=("${(@s/:/)string}")

@PythonNut:是的,
read
是所有3个shell中的内置程序(
bash
ksh
zsh
),因此不会启动额外的进程,但是,当然,shell本身就是一个进程。如何调用shell?请注意,默认情况下,Python模块
子进程
带有参数
shell=True
,模块
os
带有
system()
invoke
sh
,其中您只能依赖POSIX功能(如果平台与Unix不同,甚至不能依赖于该功能)。@mklement0:
printf%s\\n“${a[@]}”
{ba,k,z}sh
但是包含元素索引并不容易
paste@rici:感谢您指出在获取数组索引方面的差异。我的回答通过根据shell调整基本索引来演示显式数字索引的使用。这种差异可以通过
zsh
中的
emulate sh
解决(显然,还有其他副作用)-但是,这并不能解决
中的“${!a[@]}”问题。再说一遍,我甚至不清楚什么是可移植性要求。如果需要严格遵守POSIX,我的答案无论如何也不会起作用。@mklement0:“数组”一词排除了严格遵守POSIX的可能性。我把这个问题理解为关于
zsh
,因为这个词在问题中出现了四次,包括标题。(我不知道为什么会有一个
bash
标记,尽管我不会看到其他的问题。)当然,比较其他shell中的解决方案总是很有趣的。@rici:谢谢;奇怪的是,
(k)
使用普通数组返回值
cat-n
便于为从1开始的连续数组生成索引列表,但对于稀疏数组则不方便。事实上,我甚至无法手动复制
${!a[@]}
的行为(对于bash/ksh中的稀疏数组,它只返回已定义元素的索引):而
zsh
至少允许您通过
$#a
找到最大索引(请注意这与bash/ksh有多大区别),它没有实现真正的稀疏数组:所有元素都是隐式定义的,所以像
[[-z${a[i]+defined}]]
这样的测试不起作用;很好的了解-绝对是最好的
zsh
解决方案(尽管不是便携的)。
a=("${(@s/:/)string}")