在尝试通过使用NULL字符作为分隔符来正确处理文件//foldernames列表(请参阅我的其他问题)时,我偶然发现了Bash的一个奇怪的行为,我不明白:
将包含一个或多个NULL字符的字符串分配给变量时,将丢失/忽略/不存储NULL字符.
例如,
echo -ne "n\0m\0k" | od -c # -> 0000000 n \0 m \0 k
Run Code Online (Sandbox Code Playgroud)
但:
VAR1=`echo -ne "n\0m\0k"`
echo -ne "$VAR1" | od -c # -> 0000000 n m k
Run Code Online (Sandbox Code Playgroud)
这意味着我需要将该字符串写入文件(例如,在/ tmp中),如果不希望或不可行直接管道,则从那里读回.
在Z shell(zsh)中执行这些脚本时,在两种情况下都会保留包含\ 0的字符串,但遗憾的是我不能假设在运行我的脚本的系统中存在zsh而Bash应该是.
如何在不丢失任何(元)字符的情况下有效地存储或处理包含\ 0字符的字符串?
如何使用find?在名称中包含空格的目录中搜索文件?我使用脚本
#!/bin/bash
for i in `find "/tmp/1/" -iname "*.txt" | sed 's/[0-9A-Za-z]*\.txt//g'`
do
for j in `ls "$i" | grep sh | sed 's/\.txt//g'`
do
find "/tmp/2/" -iname "$j.sh" -exec cp {} "$i" \;
done
done
Run Code Online (Sandbox Code Playgroud)
但是不处理名称中包含空格的文件和目录?
我一直在阅读这篇文章:bash"for in"循环null分隔的字符串变量 ,看看我是否能够处理包含数组内部空格的任意文本.
基于上面的帖子,这很好:
while IFS= read -r -d '' myvar; do echo $myvar; done < <(find . -type f -print0)
Run Code Online (Sandbox Code Playgroud)
为了检查我的理解,我也做了这个(它仍然可以正常工作):
while IFS= read -r -d '' myvar; do echo $myvar; done < <(printf "%s\0" 'a b' 'c d')
Run Code Online (Sandbox Code Playgroud)
但是,然后我尝试将输出存储在数组中,这是错误的:
IFS= read -r -d '' -a myvar < <(printf "%s\0" 'a b' 'c d')
Run Code Online (Sandbox Code Playgroud)
该数组仅包含a b而不是c d:
echo ${myvar[@]}
a b
Run Code Online (Sandbox Code Playgroud)
显然,我在这里缺少一个更精细的细节.谢谢你的帮助.
PS.我在跑步:
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin14)
Copyright (C) 2007 Free Software Foundation, …Run Code Online (Sandbox Code Playgroud)