在 bash 脚本中实施批处理选项 --yes

在 bash 脚本中实施批处理选项 --yes

我有几个用户输入语句,例如:

read -r -p "Do u want to include this step (y) or not (n) (y/N)"? answer
if [[ "$answer" =~ ^[Yy]$ ]]; then 
    ...
fi

我正在寻找一种方法来自动对所有这些问题回答“是”。想象一个非交互式会话,其中用户使用选项调用脚本--yes。没有进一步的stdin输入。

我现在能想到的唯一方法是添加另一个条件每个if 语句。

有什么想法吗?

答案1

如果您read仅用于这些问题,并且变量始终称为answer,请替换read

# parse options, set "$yes" to y if --yes is supplied
if [[ $yes = y ]]
then
    read () {
        answer=y
    }
fi

答案2

你可以使用是(1),这根本不需要对您的脚本进行任何修改。

$ grep . test.sh
#!/bin/bash
read -rp 'What say you? ' answer
echo "Answer is: $answer"
read -rp 'And again? ' answer2
echo "Answer 2 is: $answer2"
$
$ yes | ./test.sh
Answer is: y
Answer 2 is: y

它将无限期地重复指定的咒语,如果没有指定,它将默认y

答案3

我会将整个决策逻辑放在一个函数中,既检查自动模式,也可能查询用户。然后在每种情况下从主级别调用它。want_act下面本身返回真值/假值,不需要在主级别中进行字符串比较,并且读者很清楚条件的作用。

#!/bin/bash
[[ $1 = --yes ]] && yes_mode=1

want_act() {
    [[ $yes_mode = 1 ]] && return 0
    read -r -p "Include step '$1' (y/n)? " answer
    [[ $answer = [Yy]* ]] && return 0
    return 1
}

if want_act "frobnicate first farthing"; then
    echo "frobnicating..."
fi

相关内容