기본값을 사용하여 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
'source' 카테고리의 다른 글
Android Pending이란 무엇입니까?의도? (0) | 2023.06.14 |
---|---|
import http = required ";와 import *를 'http'에서 http로 import " 사이의 차이;? (0) | 2023.06.14 |
EPLUS OpenXML 행 수를 가져오는 방법(c#) (0) | 2023.06.14 |
(다른 플랫폼에서) NDEBUG 전처리기 매크로는 무엇에 사용됩니까? (0) | 2023.06.14 |
유형 스크립트에서 문자열 변수를 문자열 리터럴 유형으로 캐스트하는 방법 (0) | 2023.06.14 |