有没有办法可以在脚本中创建一个heredoc,就好像我在提示符处一样?
这是从linux到ssh服务器的ssh,运行在通过mosh连接的android上。
我正在制作一些小脚本,让我可以通过应用termux下的bash在我的笔记本电脑上使用ssh合理地发送ssh。
在提示符下测试send命令时一切正常:
termux-sms-send -n "$(tail -n1 number | tr -d ' ')" << ''
然而,当在脚本内部时,这不再起作用。这是结果:
./main.sh: line 34: warning: here-document at line 33 delimited by end-of-file (wanted `')
./main.sh: line 35: syntax error: unexpected end of file
我当然可以用另一种方式做到这一点但是使用heredoc方法它是如此简洁和简单,这是我以前在bash中没有真正使用过的东西,我不确定如何让read命令与多行输入很好地协同工作以这样优雅的方式。
__
编辑添加:
如果有人感兴趣并且对于上下文这是脚本:
searchTxt=""
contacts="$(termux-contact-list | jq -r '.[].name')"
clear
while :; do
echo -ne "\nEnter searchterm: $searchTxt"
read -rsn1 ret; clear
if [ ${#ret} -eq 0 ]; then
if [ $(wc -l <<< "$choice") -gt 1 ]; then
echo -en "type enough characters to narrow down selecton until only 1 remains\n\n"
else
echo "choice = $choice"
number="$(termux-contact-list | jq -r ".[] | select(.name==\"$choice\") | .number")"
echo "using number: $number"
echo "$choice" > number
echo "$number" >> number
break
fi
fi
searchTxt+=$ret
choice=$(grep -i "$searchTxt" <<< "$contacts")
echo "$choice"
done
while :; do
clear
echo "Type message to send, enter a blank line to send message"
echo -n "message: "
termux-sms-send -n "$(tail -n1 number | tr -d ' ')" << ''
done
答案 0 :(得分:2)
建议的习惯用法是在代码中寻找一个简单的换行符(因为代码是从正在读取heredoc的地方),而不是stdin中的裸行换行符
这适用于交互式提示,其中您的代码来自stdin - 但是它不能从脚本中运行的原因应该是显而易见的。
以下循环明确了关于查看输入流:
while IFS= read -r line; do
[[ $line ]] || break
printf '%s\n' "$line"
done | termux-sms-send -n "$(tail -n1 number | tr -d ' ')"