gpt4 book ai didi

linux - Shell:将带有参数的函数作为函数参数传递

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:31 25 4
gpt4 key购买 nike

我正在开发一个 shell 程序来自动化我的 Arch(强制 btw)安装。为了使其更具交互性,我构建了以下函数:

  # READYN
# ARGS:
# - Yes/no question
# - Command to run if yes
# - Command to run if no
#
# Prompts the user with a yes/no question (with precedence for yes) and
# run an order if the answer is yes or another if it's no.

readyn () {
while :
do
local yn;

printf "%s? [Y/n]: " "$1";
read yn;

if [[ "$yn" =~ ^([yY][eE][sS]|[yY])?$ ]]; then
$2;
break;
elif [[ "$yn" =~ ^([nN][oO]|[nN])+$ ]]; then
$3;
break;
fi
done
}

我已成功"echo Hello World!" 作为参数传递并让它运行。我还能够传递另一个函数。例如:

yayprompt () {
printf "yay is required to install %s.\n" "$1"
readyn "Install yay, the AUR manager" "yayinstall" ""
}

如果是,这将调用 yayinstall,如果不是,则什么都不做。

我的问题来自更复杂的函数,这些函数作为参数传递,但要么无法识别,要么在不应该的时候运行。问题来自以下功能:

  # MANAGEPGK
# ARGS:
# - Package name
# - Package variable
# - Yay required
#
# Checks if the package is added to the pkglist to either add or remove it.
# If yay is required to install it, it prompts the user whether they wish
# to install yay or don't install the package (if yay is not installed).
# This functions DOES NOT prompt any installation options on the user. To
# do this, use PROMPTPKG.

managepkg () {
local pkgvar=$2

if [ $pkgvar == 0 ]; then
if [ $3 == 1 ] && [ $yay == 0 ]; then
yayprompt;
fi

if [ $3 == 0 ] || [ $yay == 1 ]; then
addpkg "$1";
pkgvar=1;
fi
else
rmpkg "$1";
pkgvar=0;
fi

echo "$pkgvar";
}

为了使其正常工作,必须(或者至少我必须)这样调用它:

dewm_cinnamon=$(managepkg cinnamon $dewm_cinnamon 0)

现在,我试图将它作为参数传递给 readyn,但我的输出取决于格式(我总是回答 yes作为空字符串:

简单引号:

readyn "Install gaps" \
'dewm_i3gaps=$(managepkg i3-gaps $dewm_i3gaps 0)' \
'dewm_i3=$(managepkg i3-wm $dewm_i3 0)';
Install gaps? [Y/n]:
./architup.sh: line 341: dewm_i3gaps=$(managepkg: command not found

双引号:

readyn "Install gaps" \
"dewm_i3gaps=$(managepkg i3-gaps $dewm_i3gaps 0)" \
"dewm_i3=$(managepkg i3-wm $dewm_i3 0)";
Install gaps? [Y/n]: 
./architup.sh: line 341: dewm_i3gaps=1: command not found

封闭的美元:(这个运行两个命令,如 cat pkglist 中所示)

readyn "Install gaps" \
$(dewm_i3gaps=$(managepkg i3-gaps $dewm_i3gaps 0)) \
$(dewm_i3=$(managepkg i3-wm $dewm_i3 0));
Install gaps? [Y/n]: 
Install compton? [Y/n]: ^C

Documents/Repositories/architup took 5s
➜ cat pkglist
i3-gaps
i3-wm

我应该使用什么语法让 readyn 根据用户输入运行一个命令?

谢谢!

最佳答案

函数参数只是字符串。恕我直言,更好的设计是简单地让 readyn 为"is"返回真(零),否则返回假,并让调用代码基于此实现任何条件逻辑。

readyn () {
read -p "$@"
case $REPLY in
[Yy] | [Yy][Ee][Ss]) return 0;;
esac
return 1
}

readyn "Are you ready San Antonio?" &&
rock and roll

if readyn "Let me hear you say yeah"; then
echo "Let's go!"
else
echo "If you feel mellow, get outta here"
fi

(对各地的摇滚音乐会表示歉意,)

关于linux - Shell:将带有参数的函数作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56986826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com