从文本文件传递变量的奇怪问题

从文本文件传递变量的奇怪问题

我有一个脚本,可以为文件中的每一行运行另一个脚本。

当我echo每次都$line可以按预期看到该行的完整内容。

connect.sh仅在内部$1设置为user\ name

当我尝试使用时"$line"$1结果connect.shuser\ name user\ password

如何设置程序流程,以便将toreboot.sh的每一行作为 2 个参数传递。/tmp/historyconnect.sh

最终结果$1user\ name$2user\ 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 nameand 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"

请记住,如果您将一个参数传递给程序并且该参数包含空格,则需要使用双引号以使程序将其视为一个参数。

相关内容