![从文本文件传递变量的奇怪问题](https://linux22.com/image/122250/%E4%BB%8E%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%BC%A0%E9%80%92%E5%8F%98%E9%87%8F%E7%9A%84%E5%A5%87%E6%80%AA%E9%97%AE%E9%A2%98.png)
我有一个脚本,可以为文件中的每一行运行另一个脚本。
当我echo
每次都$line
可以按预期看到该行的完整内容。
但connect.sh
仅在内部$1
设置为user\ name
。
当我尝试使用时"$line"
,$1
结果connect.sh
是user\ name user\ password
。
如何设置程序流程,以便将toreboot.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
答案1
我假设反斜杠是为了转义两个空格,这样它们就不会分隔这些值。
这样read -r line
你就可以得到变量 中的整行line
,因此line
包含user\ name user\ password
, 和退格键。如果没有技巧,将其拆分并不容易eval
。未加引号的内容$line
会因空格、反斜杠而被分割。引用后,它会扩展为一个单词,如您所见。
幸运的是,read
可以处理反斜杠并将其输入分成两个(或更多)变量。这将使变量包含user name
and user password
(删除反斜杠):
while read user pass ; do
echo "user: $user"
echo "pass: $pass"
./connect.sh "$user" "$pass"
done < file
但是,如果您想在用户名和密码中允许使用空格,最好使用空格以外的其他分隔符。冒号很常见,所以你会有这样的输入:
user name:user pass word
然后阅读它
while IFS=: read -r user pass ; do
echo "user: $user"
echo "pass: $pass"
done < file
(只要密码不以冒号结尾就应该有效)
答案2
如果参数中包含空格,则需要确保用双引号将该字符串引起来,以防止connect.sh
将其解释为多个参数。您可能希望将字符串拆分为多个参数。我不确定该行的格式是什么,但您也许可以执行以下操作:
line="user name user password"
# Split the line into space-separated tokens and store 1 and 2
UNAME=$(echo "$line" | cut -d ' ' -f 1,2)
# Split the line into space-separated tokens and store 3 and 4
UPASSWD=$(echo "$line" | cut -d ' ' -f 3,4)
echo "$UNAME"
echo "$UPASSWD"
这应该打印:
user name
user password
您可能需要根据输入行的实际格式进行一些调整。例如,如果您的 $line 具有用逗号分隔的用户名和用户密码,您可以运行:
line="user name,user password"
# Split the line into comma-separated tokens and store 1
UNAME=$(echo "$line" | cut -d ',' -f 1)
# Split the line into comma-separated tokens and store 2
UPASSWD=$(echo "$line" | cut -d ',' -f 2)
echo "$UNAME"
echo "$UPASSWD"
请记住,如果您将一个参数传递给程序并且该参数包含空格,则需要使用双引号以使程序将其视为一个参数。