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

时间:2015-01-26 14:25:18

标签: bash infinite-loop

一个非常简单的例子"只运行一次"我的脚本版本:

./myscript.sh var1 "var2 with spaces" var3
#!/bin/bash
echo $1 #output: var1
echo $2 #output: var2 with spaces
echo $3 #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

似乎读取了在空格处分割输入,将所有那些留在最后一个var中,对吗?是否有更好的可能性在循环中添加变量?或者我如何阅读行为就像我在脚本后面添加了变量?

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

1 个答案:

答案 0 :(得分:1)

这将读取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 $1
  echo $2
  echo $3
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 ‘-’.