无法修改Bash脚本时,如何实现交互式输入或外部传参?
关于Bash脚本的两个问题解答
1. 交互式执行脚本时是否支持用户输入?
当然支持!如果你直接在终端里交互式运行这个脚本(比如执行 ./your_script.sh),当脚本走到 read INFO 这一行时,终端会自动暂停,等你输入yes或no这类内容,输入完回车后脚本就会继续往下跑。
这是因为read命令默认从**标准输入(stdin)**读取数据,而交互式Shell的stdin就是你的终端,所以完全没问题。除非脚本被重定向了输入(比如用管道或文件当输入源),否则交互式输入都是正常工作的。
2. 能否从脚本外部(远程)设置脚本内的变量?
这里得说明下:你的脚本是用read给INFO变量赋值的,read会覆盖变量之前的任何值,所以直接设置环境变量的方法不会生效,但我们可以通过给脚本的标准输入传值的方式,间接实现“设置”变量的效果:
本地外部传值
用管道传递输入:
echo "yes" | ./your_script.sh这样
read INFO会读取管道里的yes,自动赋值给变量,不用手动输入。用Here字符串传递输入:
./your_script.sh <<< "yes"这和管道效果类似,但语法更简洁,适合短字符串输入。
远程传值(通过SSH)
如果要远程执行脚本并传入值,把上面的方法结合到SSH命令里就行:
ssh user@remote_host 'echo "yes" | /path/to/your_script.sh' # 或者用Here字符串写法 ssh user@remote_host '/path/to/your_script.sh <<< "yes"'
这样远程执行脚本时,read会自动读取传入的内容,不需要交互式操作。
另外就算脚本里的read带提示(比如read -p "确认操作?" INFO),上面的方法依然有效——因为read的提示信息会输出到标准错误(stderr),我们传递的是标准输入(stdin),两者互不干扰。
内容的提问来源于stack exchange,提问作者CWollinger




