bash - POSIX 等价于 prinf -v
问题描述
我有一个脚本用另一个值替换一个变量,具体取决于输入:
#!/bin/bash
prompt()
{
while true; do
read -p "Do you wish to install this program? " "ANSWER"
case "$ANSWER" in
[Yy]* ) printf -v "$1" %s "true"; break;;
[Nn]* ) printf -v "$1" %s "false"; break;;
* ) echo "Please answer yes or no.";;
esac
done
}
prompt "QUESTION"
if [ "$QUESTION" = "true" ]; then
echo "SUCCESS"
elif [ "$QUESTION" = "false" ]; then
echo "FAILURE"
fi
这很好用,尽管我希望脚本符合 POSIX。我#!/bin/sh
用于我所有的脚本,虽然printf -v
是 bashism。我该如何修改这个程序?我可以使用等效的功能吗?谢谢!
解决方案
read
本身可以设置名称在$1
. 但是,您仍然需要read ANSWER
先检查响应。完成后,您可以使用read
here-document 将值传输$ANSWER
到任何变量prompt
请求。
prompt () {
while :; do
printf "Do you wish to install this program? " >&2
read ANSWER
case $ANSWER in
[Yy]* ) ANSWER=true ; break ;;
[Nn]* ) ANSWER=false; break ;;
* ) printf 'Please answer yes or no.\n' >&2 ;;
esac
done
read "$1" <<EOF
$ANSWER
EOF
}
您可以使用命令替换来确保ANSWER
未在全局环境中设置。
prompt () {
read "$1" <<EOF
$(while :; do
printf "Do you wish to install this program? " >&2
read ANSWER
case $ANSWER in
[Yy]* ) printf true; break ;;
[Nn]* ) printf false; break ;;
* ) printf 'Please answer yes or no.\n' >&2 ;;
esac
done
)
EOF
}
推荐阅读
- python - 在 InterruptionKey 时使用 psycopg2 终止未完成的 SQL 提交查询
- javascript - Tinymce - images_upload_handler - 验证最大文件大小
- json - Flutter/Dart JSON 和现有库类的序列化
- google-chrome - VSCode 调试器无法连接到 Karma 运行的 puppeteer 实例
- python - 如何调用具有需要调用其他函数的条件的函数
- matlab - 如何在位置 2 的 Matlab 索引上解决此问题超出数组范围?
- arangodb - Arangodb 找到条件最短路径
- node.js - 如何将 readFileSync 代码转换为 readFile?
- react-admin - 反应管理员
组件不会触发数据提供者中的“更新”操作 - javascript - 如何清除 JavaScript 中异步函数的超时