这是原始数据的一大块:
00000000 54 6f 70 69 63 20 46 6f 72 75 6d 20 52 65 70 6c |Topic Forum Repl|
00000010 69 65 73 20 4c 61 73 74 20 70 6f 73 74 20 31 20 |ies Last post 1 |
00000020 4c 69 6e 75 78 20 54 6f 64 61 79 20 31 34 3a 34 |Linux Today 14:4|
00000030 36 3a 35 37 20 62 79 20 4c 69 6e 75 78 20 4f 75 …Run Code Online (Sandbox Code Playgroud) 在while循环中,如何编写交互式响应?
#!/bin/bash
shows=$(< ${HOME}/.get_iplayer/tv.cache)
# ...
# ... stuff with shows omitted ...
# ...
function print_show {
# ...
return
}
while read -r line
do
print_show "$line"
read -n 1 -p "do stuff? [y/n] : " resp # PROBLEM
# ...
# resp actions omitted
# ...
done <<< "$shows"
Run Code Online (Sandbox Code Playgroud)
因此,读取文件,进行“处理”,然后将所得的面向行的数据用于while read循环中
但是while循环中的读取行无法按预期工作,也就是说,它没有等待用户响应,这可能是由于while read封装了上下文所致。
您能否建议如何解决此问题或其他机制?
前几天我正在试验shell函数,目的是覆盖ls命令.目的是让shell ls首先调用我的函数然后如果第一个开关是"-y"做一件事,否则调用常规函数/bin/ls,但结果表现为我不理解的方式.
为了启用它,我决定使用"-y"作为开关,因为:
$ ls -y
ls: invalid option -- 'y'
Try `ls --help' for more information.
Run Code Online (Sandbox Code Playgroud)
所以它无法打破核心功能ls.无论如何,将问题简化为最简单的问题,并通过其他一些示例来帮助突出问题:
$ function ls() { [[ "y$1" == "y-y" ]] && echo LS ; }
$ function less() { [[ "y$1" == "y-y" ]] && echo LESS ; }
$ function try() { [[ "y$1" == "y-y" ]] && echo TRY ; }
Run Code Online (Sandbox Code Playgroud)
所以我压倒一切ls,less并定义try哪个像"控制"标本:)
现在调用这种方式:
$ ls ; less ; …Run Code Online (Sandbox Code Playgroud) 这是密码生成器的一个片段:
# ...
ascstring='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHILKLMNOPQRSTUVWXYZ!#$%&()*+-; <=>?@^_`{|}~'
asclen=${#ascstring} # modulo ascstring
#...
r=$(openssl rand 100000 | sha1sum) # generates 40 hex sequence
#...
for i in {0..38..2}
do
v=${r:i:2} ; echo -n ${ascstring:$[ 0x$v % $asclen]:1}
done
echo
# ...
Run Code Online (Sandbox Code Playgroud)
它使用了各种定义ascstring但是所显示的定义偶尔会引起问题.大多数情况下没关系:
$ ./password-gen.sh
`?OCw&a|746|SRm8b&c=
$ ./password-gen.sh
eE?R%3NdUjSpd<)wPuBV
$ ./password-gen.sh
0X8)p8hPobt$x@iGy?!I
$ ./password-gen.sh
P7LD;p<^lX1d87;{V4S$
Run Code Online (Sandbox Code Playgroud)
但偶尔:
$ ./password-gen.sh
5w@$ypassword-gen.sh@)A|l`06B(50f7
Run Code Online (Sandbox Code Playgroud)
如果我*从中移除了ascstring这似乎永远不会发生.我想知道发生了什么以及如何解决这个问题(不减少熵)?
谢谢.