source

기본값을 사용하여 bash에서 변수 읽기

manysource 2023. 6. 14. 21:56

기본값을 사용하여 bash에서 변수 읽기

단말기에서 bash 스크립트의 값을 읽어야 합니다.사용자가 변경할 수 있는 기본값을 제공하고 싶습니다.

# Please enter your name: Ricardo^

이 스크립트에서 프롬프트는 "이름을 입력하십시오:"이고 기본값은 "리카르도"이고 커서는 기본값 다음에 있습니다.bash 스크립트에서 이 작업을 수행할 수 있는 방법이 있습니까?

매개 변수 확장을 사용할 수 있습니다.

read -p "Enter your name [Richard]: " name
name=${name:-Richard}
echo $name

괄호 사이의 프롬프트에 기본값을 포함하는 것은 상당히 일반적인 관례입니다.

무엇을 합니까?:-Richard파트 do?bash 매뉴얼에서:

${parameter:-word}매개 변수가 설정되지 않았거나 null인 경우 단어 확장이 대체됩니다.그렇지 않으면 매개 변수 값이 대체됩니다.

또한 주목할 가치가 있는 것은

아래의 각 경우에서 단어는 타일 확장, 매개 변수 확장, 명령 대체 및 산술 확장을 따릅니다.

그래서 만약 당신이webpath=${webpath:-~/httpdocs}의 결과를 얻을 것입니다./home/user/expanded/path/httpdocs것은 아니다.~/httpdocs,기타.

read -e -p "Enter Your Name:" -i "Ricardo" NAME

echo $NAME

주의:

  • 이 옵션을 사용하려면 bash 4 이상이 필요합니다.bash --version)
  • macles에서 현재 설치bash홈브루브루를 사용합니다.
  • -e그리고.-i함께 작업:-e사용하다readline,-i다음을 사용하여 텍스트 삽입readline
  • bash 4+ 수동 페이지 for - linuxcommand.org

Bash 4에서:

name="Ricardo"
read -e -i "$name" -p "Please enter your name: " input
name="${input:-$name}"

이렇게 하면 프롬프트 뒤에 다음과 같은 이름이 표시됩니다.

Please enter your name: Ricardo

이름의 끝에 커서를 두고 사용자가 편집할 수 있습니다.마지막 줄은 선택 사항이며 사용자가 입력 또는 기본값을 지우는 경우(null 제출) 이름을 원래 기본값으로 지정합니다.

코드:

IN_PATH_DEFAULT="/tmp/input.txt"
read -p "Please enter IN_PATH [$IN_PATH_DEFAULT]: " IN_PATH
IN_PATH="${IN_PATH:-$IN_PATH_DEFAULT}"

OUT_PATH_DEFAULT="/tmp/output.txt"
read -p "Please enter OUT_PATH [$OUT_PATH_DEFAULT]: " OUT_PATH
OUT_PATH="${OUT_PATH:-$OUT_PATH_DEFAULT}"

echo "Input: $IN_PATH Output: $OUT_PATH"

샘플 런:

Please enter IN_PATH [/tmp/input.txt]: 
Please enter OUT_PATH [/tmp/output.txt]: ~/out.txt
Input: /tmp/input.txt Output: ~/out.txt

저는 다음과 같은 것을 제시하는 방법을 찾다가 이 질문을 발견했습니다.

Something interesting happened.  Proceed [Y/n/q]:

위의 예를 사용하여 저는 이것을 추론했습니다.

echo -n "Something interesting happened.  "
DEFAULT="y"
read -e -p "Proceed [Y/n/q]:" PROCEED
# adopt the default, if 'enter' given
PROCEED="${PROCEED:-${DEFAULT}}"
# change to lower case to simplify following if
PROCEED="${PROCEED,,}"
# condition for specific letter
if [ "${PROCEED}" == "q" ] ; then
  echo "Quitting"
  exit
# condition for non specific letter (ie anything other than q/y)
# if you want to have the active 'y' code in the last section
elif [ "${PROCEED}" != "y" ] ; then
  echo "Not Proceeding"
else
  echo "Proceeding"
  # do proceeding code in here
fi

누군가가 같은 문제에 직면했을 때 논리를 생각할 필요가 없기를 바랍니다.

이 패턴을 사용했습니다. 선호하는 패턴은 다음과 같습니다.

read name || name='(nobody)'
name=Ricardo
echo "Please enter your name: $name \c"
read newname
[ -n "$newname" ] && name=$newname

기본값을 설정하고, 인쇄하고, 새 값을 읽습니다. 새 값이 있으면 기본값 대신 사용합니다.셸과 시스템 간에 프롬프트 끝에 새 줄을 표시하지 않는 방법에 대한 차이가 있습니다.'\c' 표기법은 3.x bash가 있는 MacOS X 10.6.3에서 작동하는 것으로 보이며, Bourne 또는 Korn 셸을 사용하여 시스템 V에서 파생된 대부분의 유닉스 변형에서 작동합니다.

또한 사용자는 화면에 이미 표시된 이름 뒤에 새 데이터가 입력되기 때문에 백그라운드에서 무슨 일이 일어나고 있는지 모를 수 있습니다.포맷하는 것이 더 나을 수 있습니다.

echo "Please enter your name ($name): \c"
#Script for calculating various values in MB
echo "Please enter some input: "
read input_variable
echo $input_variable | awk '{ foo = $1 / 1024 / 1024 ; print foo "MB" }'

-e와 -t 매개 변수가 함께 작동하지 않습니다. 몇 가지 표현식을 시도해 보았더니 다음과 같은 코드 스니펫이 나왔습니다.

QMESSAGE="SHOULD I DO YES OR NO"
YMESSAGE="I DO"
NMESSAGE="I DO NOT"
FMESSAGE="PLEASE ENTER Y or N"
COUNTDOWN=2
DEFAULTVALUE=n
#----------------------------------------------------------------#
function REQUEST ()
{
read -n1 -t$COUNTDOWN -p "$QMESSAGE ? Y/N " INPUT
    INPUT=${INPUT:-$DEFAULTVALUE}
    if  [ "$INPUT" = "y" -o "$INPUT" = "Y" ] ;then
        echo -e "\n$YMESSAGE\n"
        #COMMANDEXECUTION
    elif    [ "$INPUT" = "n" -o "$INPUT" = "N" ] ;then
        echo -e "\n$NMESSAGE\n"
        #COMMANDEXECUTION
    else
        echo -e "\n$FMESSAGE\n"
    REQUEST
    fi
}
REQUEST

언급URL : https://stackoverflow.com/questions/2642585/read-a-variable-in-bash-with-a-default-value