기본값으로 bash에서 변수 읽기


191

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

# Please enter your name: Ricardo^

이 스크립트에서 프롬프트는 "이름을 입력하십시오 :"입니다. 기본값은 "Ricardo"이며 커서는 기본값 뒤에 있습니다. bash 스크립트에서 이것을 수행하는 방법이 있습니까?

답변:


280

당신이 사용할 수있는 매개 변수 확장의 예를

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

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


7
나는 이것에 기초하여 무언가를했다. 임시 변수를 읽고을 input사용 name=${input:-$name}합니다.
Ricardo Marimon

41
이것은 실제로 질문에 대답하지 않습니다. 프롬프트에 기본값이 표시되어야합니다.
Dr. Person Person II

3
그리고 무엇을 name=${!input:-$name}할 것인가?
Harry Lee

8
@ Dr.PersonPersonII-다음과 같은 방법으로 기본값을 추가 할 수 있습니다 : read -p "원격 호스트 이름 [$ remote_host_default] 입력 :"remote_host remote_host = $ {remote_host :-$ remote_host_default}
Dobler

4
$1가된다${1:-some_default_string}
ThorSummoner

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

echo $NAME

1
좋은 답변입니다! 나는 "리카르도"와 NAME 사이의 공간을 보지 못했기 때문에 문제가 있었다고 말하고 싶지만 일단 그것을 알아 냈습니다 .... 마술 ! 감사합니다!
Mr Mikkél

40
불행히도 -i는 OSX 10.7에 유효한 옵션이 아닙니다
undefined

3
@BrianMortenson homebrew를 사용하여 bash를 업그레이드 할 수 있습니다 : stackoverflow.com/questions/16416195/…
antonagestam

2
이 답변은 OS X (Bash 3.x)에서이 작업을 수행하는 방법을 보여줍니다. stackoverflow.com/questions/22634065/…
Christoph Petschnig

3
그냥 참고 -e필수 것으로 보인다 허용하는 -i실제 작업에
MestreLion에게

48

배쉬 4에서 :

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

프롬프트 뒤에 다음과 같이 이름이 표시됩니다.

Please enter your name: Ricardo

이름 끝에 커서를 놓고 사용자가 편집 할 수 있도록합니다. 마지막 행은 선택 사항이며 사용자가 입력 또는 기본값을 지우면 (널 제출) 이름이 원래 기본값이됩니다.


bash4는 데비안 배포판에서 표준이 아니기 때문에 사용할 수 없습니다. 많은 번거 로움없이 작동 할 무언가가 필요합니다.
Ricardo Marimon

1
마지막 코드 줄이 필요하지 않으므로 명령 name대신 대신 사용 input하십시오 read.
RNA

1
@RNAer : 추가 변수를 사용하면 $name사용자가 제안 된 값을 삭제하여 null 문자열을 입력하면 값이 유지됩니다. 그것은 모두 당신의 필요에 달려 있습니다. 나는 내 대답에서 많이 말했다. 그러나 당신은 더 명확 할 수 있고 선택적 라인을 사용하지 않으면 변수가 될 수 있다고 말했습니다 name.
추후 공지가있을 때까지 일시 중지되었습니다.

1
@DennisWilliamson : 네 말이 맞아. 그것이 원하는 것이면 좋은 습관입니다.
RNA

16

암호:

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

콜론 앞에 기본값이 대괄호 안에있는 많은 쉘 스크립트에서 볼 수있는 규칙을 따르기 때문에 이것을 좋아합니다. 감사!!!
morphatic

16

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

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

누군가가 같은 문제가 발생하면 논리를 생각할 필요가 없도록 돕는 희망


아주 좋아요 누군가가 "k"나 주어진 선택 이외의 것을 입력하면 질문을 반복하는 것이 조금 개선 될 수도 있습니다.
erikbwork

1
나는 단지 가려운 가려움증에 이어이 의견을 썼다. 나는 위의 내용을 포함하는 쉘 기능을 가지고 있으며 그것을 사용하는 경향이 있습니다. 쉘은 잘 반복되지 않으므로 피하려고합니다. 내 함수의 결과를 테스트하고 한 번 더 시도해 볼 수 있지만 기본적으로 문제가 발생할 수있는 관리자 도구를 작성하고 있으므로 관리자가 스크립트를 깨끗하게 중지 할 수 있기를 원합니다.
sibaz

11

방금이 패턴을 사용했습니다.

read name || name='(nobody)'

6
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 쉘을 사용하여 System V에서 파생 된 대부분의 Unix 변형에서 작동합니다.

또한 사용자는 아마도 무대 뒤에서 무슨 일이 일어나고 있는지 알지 못할 것입니다. 새로운 데이터는 이미 화면에 표시된 이름 뒤에 입력됩니다. 형식을 지정하는 것이 좋습니다.

echo "Please enter your name ($name): \c"

printf보다 더 휴대용echo
ghostdog74

3
@ ghostdog74 : 아마도 그렇습니다; 25 년 전에 쉘 프로그래밍을 배운 사람들은 우리의 관행 중 어느 것이 여전히 관련이 있는지 알아내는 데 어려움을 겪고 있습니다. bash가 거의 모든 것을 다시 쓴 것처럼 보입니다. 나는 printf가 명령으로 오랫동안 사용되어 왔음을 알고 있습니다.하지만 거의 사용하지 않을 것입니다. bash를 (재) 학습 할 때까지 쉘에서 종료해야한다는 인상을 받았습니다. '재미있어; 내가 작업하는 소프트웨어에는 잘 작동하지 않는 쉘 스크립트가 있지만 문제는 bash-ism이 아닙니다. 나는 ' if (test -z "$xxx"); ...'와 다른 C 쉘을 고치는 것에 지쳤다.
Jonathan Leffler

bash가 지원하기 \c때문에 bash가 지원한다는 사실에 놀랐 습니다 echo -n! 그러나 -e탈출을 해석하기 위해 bash의 에코를 얻으려면 추가해야합니다 . 나는 \c말하지 않은 것들을위한 것 같다 :echo -e "Syntax slightly off\c, but I've learned so much from what you've shared. Thanks, @JonathanLeffler!"
jpaugh

1
#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" }'

3
답변에 설명을 추가하십시오.
Sufiyan Ghori

-1

-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

당신의 대답은하지 많은 질문을 할 수있다이 그것 ...?
gniourf_gniourf

-e 및 -t 매개 변수 사용에 대한 임시 해결책입니다. (-e 및 기본 값 -i)이 코드 라인 : 읽기 -e -p "당신의 이름을 입력 :"-i "리카르도"NAME은 countdowntimer와 함께 일을하지 않습니다 (-t)
speefak

예, 그러나 그것은 질문에 묻지 않았습니다.
gniourf_gniourf 20시 36 분

3
당신이 할 수있는 일은 새로운 질문을하고 스스로 대답하는 것 ;)입니다. SO에서도 허용됩니다! 그러나 우리는 다른 질문들을 관련없는 것들로 오염시키고 싶지 않습니다.
gniourf_gniourf 20시 36 분
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.