一个非常简单的例子"只运行一次"我的脚本版本:
./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时,循环中执行一个脚本的那种循环的英文单词是什么?如果我不知道它叫什么,就不能谷歌样本......
答案 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 ‘-’.