回声名称不是数字以防(选择)。 #bash

Echo name not a number in case (choice). #bash

我需要回显 - 选择 - 从案例到 csv 文件。 当我从下面回显 varSel 时,我只得到数字,我想要“名称”(在本例中为 sale 或 return)。 while 循环在这里只是为了缩小用户的选择范围。它是更大脚本的一部分,但截至目前我只需要这部分工作,其他任何部分都可以。

#! /bin/bash


while true; do
    echo    "1) sale"
    echo    "2) return"
    

    read -p "Choose your options: " varSel
    case ${varSel} in
    1) var1="sale"; break;;
    2) var1="return"; break;;
    *) echo "Choose options between 1 and 2";;
    esac
done

echo $varSel >> logfile.csv

正如评论中已经提到的另一位用户,您应该在脚本的最后一行 echo "$var1" >> logfile.csv 而不是 echo $varSel >> logfile.csv


另一种更复杂的方法是使用包含可能选择的数组作为驱动其他所有内容的基础(为了说明,我添加了更多选择):

#!/bin/bash

choices=("sale" "return" "somethingelse" "hello" "world")

while true; do

    # List possible choices
    for ((i=0; i < ${#choices[@]}; i++)); do
        echo "$((i+1))) ${choices[i]}"
    done

    # Prompt user to choose
    read -p "Choose your options: " varSel

    # Check if choice is valid, break loop if so
    # (varSel needs to be: non-empty, an integer and within range of possible choices)
    if [[ "${varSel}" != "" && "${varSel}" != *[!0-9]* ]] && (( ${varSel} >= 1 && ${varSel} <= ${#choices[@]} )); then
        choice="${choices[varSel-1]}"
        break
    else
        echo "Choose options between 1 and ${#choices[@]}"
    fi

done

echo "${choice}" >> logfile.csv

这可以用作任意数量选择的通用模板。这里有一件棘手的事情是跟踪选择数字与数组索引(选择是 1..n,数组索引是 0..n-1)。

您正在重新发明内置 select 命令:

#!/usr/bin/env bash
PS3="Choose your options: "
select choice in sale return; do
    [[ -n $choice ]] && break
done
echo "$choice" >> logfile.csv