我有一个脚本,它为文件中的每一行运行另一个脚本。
当我echo
每个人都$line
可以按预期看到该行的全部内容时。
然而 inside connect.sh
only$1
设置为user\ name
。
当我尝试使用时"$line"
,最终成为.$1
connect.sh
user\ name user\ password
如何设置程序流程,以便将to的reboot.sh
每一行作为 2 个参数传递。/tmp/history
connect.sh
最终结果$1
是user\ name
和$2
是user\ password
?
重启.sh:
if [ -e "/tmp/history" ]; then
while read -r line; do
echo $line
connect.sh $line \
&& break
done </tmp/history
fi
连接.sh:
echo $1
echo $2
/tmp/历史:
user\ name user\ password
我假设反斜杠是用来转义两个空格的,这样它们就不会分隔值。
随着
read -r line
您在变量中获得整行line
,因此line
包含user\ name user\ password
,以及退格。没有技巧就很难将其拆分eval
。未引用的$line
将在空格、反斜杠上拆分。如您所见,引用后,它会扩展为一个词。幸运的是,
read
可以处理反斜杠并将其输入拆分为两个(或更多)变量。这将使变量包含user name
和user password
(删除反斜杠):但是,如果您想在用户名和密码中允许空格,则最好使用其他分隔符而不是空格。冒号很常见,所以你会有这样的输入:
然后阅读它
(只要密码不以冒号结尾,这应该可以工作)
如果您的参数中有空格,则需要确保将字符串双引号以防止
connect.sh
将其解释为多个参数。您可能希望将字符串拆分为多个参数。我不确定该行的格式是什么,但是您可以执行以下操作:这应该打印:
您可能需要根据输入行的实际格式进行一些调整。例如,如果您的 $line 具有用逗号分隔的用户名和用户密码,您可以运行:
请记住,如果您将参数传递给程序并且该参数有空格,则需要使用双引号使程序将其视为一个参数。