从 bash 脚本到 bash 无限循环中的脚本

From bash script to bash script in infinite loop

我的脚本 "just run once" 版本的一个非常简单的示例:

./myscript.sh var1 "var2 with spaces" var3
#!/bin/bash
echo  #output: var1
echo  #output: var2 with spaces
echo  #output: var3

按预期工作! 现在我尝试只启动脚本并循环输入变量,因为稍后我想一次将多个数据集复制到 shell.

./myscript.sh
#!/bin/bash  
while true; do
  read var1 var2 var3
  #input: var1 "var2 with spaces" var3
  echo $var1 #output: var1
  echo $var2 #output: "var2
  echo $var3 #output: with spaces" var3
done

似乎 read 在空格处拆分输入,将所有剩余的内容放在最后一个 var 中,对吗?有没有更好的可能性在循环中添加变量?或者我如何才能像我在脚本后面添加变量那样阅读?

那种在循环中执行一个脚本同时将不同的变量复制到shell的循环的英文单词是什么?如果我不知道它叫什么,就不能 google 样品...

这会读取 STDIN 并将这些行解析为带有 shell 引号的参数:

# Clean input of potentially dangerous characters. If your valid input
# is restrictive, this could instead strip everything that is invalid
# s/[^a-z0-9" ]//gi
sed -ue 's/[][(){}`;$]//g' | \
while read input; do
  if [ "x$input" = "x" ]; then exit; fi      
  eval "set -- $input"
  # check argument count
  if [ $(( $# % 3 )) -ne 0 ]; then 
     echo "Please enter 3 values at a time"
     continue;
  fi

  echo 
  echo 
  echo 
done

set -- $input 施展所有魔法。请参阅 set 的 Bash 手册页。

--
    If no arguments follow this option, then the positional parameters are   
    unset. Otherwise, the positional parameters are set to the arguments, 
    even if some of them begin with a ‘-’.