스 크 립 트 입력 처리 - 사용자 입력 획득
20916 단어 shell
사용자 입력 가 져 오기
대화 형 Shell 스 크 립 트 에 서 는 일반적으로 read 명령 을 사용 하여 사용자 의 입력 을 가 져 옵 니 다.
기본 읽 기
read 명령 에서 자주 사용 하 는 문법 형식:
read [-p prompt] [var1 var2...]
- p 옵션 은 입력 을 읽 기 전에 알림 정보 (prompt) 의 내용 을 표준 출력 으로 표시 하 는 데 사 용 됩 니 다.일반적인 상황 은 사용자 가 어떤 입력 정 보 를 입력 하 는 지 알려 주 는 데 쓰 인 다.
read 명령 은 매번 표준 입력 에서 한 줄 의 내용 을 읽 습 니 다 (- u 는 파일 설명 자 를 지정 할 수 있 습 니 다). 첫 번 째 단 어 를 첫 번 째 변수 var 1 에 할당 하고 두 번 째 대 가 는 var 2 에 할당 합 니 다.입력 한 단일 횟수 가 지정 한 변수 보다 적 으 면 나머지 는 비어 있 습 니 다.IFS 전역 환경 변 수 는 입력 내용 사이 의 분할 부 호 를 설정 할 수 있 으 며 기본 값 은 빈 칸 입 니 다.
예:
[root@rs1 read]# cat read_1.sh
#提示用户输入用户名,然后将用户的输入赋值给变量username
read -p "Enter your name,please: " username
#提示用户输入电话号码,然后赋值给变量email
read -p "Enter your tel number,please: " tel
#询问用户是否继续,提示输入y或n,然后将用户输入的内容赋值给input
read -p "Are your sure to contuinue?[y/n]" input
case $input in
#如果输入为y或者Y,则显示用户名和电话到标准输出
y|Y)
echo "Your name is : $username"
echo "Your tel number is : $tel "
;;
[nN]*)
echo "Bye"
exit
;;
*)
echo "Just input y or n,please"
exit 1
;;
esac
스 크 립 트 실행:
[root@rs1 read]# bash read_1.sh
Enter your name,please: fsx
Enter your tel number,please: 123
Are your sure to contuinue?[y/n]y
Your name is : fsx
Your tel number is : 123
[root@rs1 read]# bash read_1.sh
Enter your name,please: fsx
Enter your tel number,please: 123
Are your sure to contuinue?[y/n]n
Bye
[root@rs1 read]# bash read_1.sh
Enter your name,please: fsx
Enter your tel number,please: 123
Are your sure to contuinue?[y/n]Nsd
Bye
[root@rs1 read]# bash read_1.sh
Enter your name,please: fsx
Enter your tel number,please: 123
Are your sure to contuinue?[y/n]ttt //参数输入错误的情况
Just input y or n,please
입력 시간 초과
read 의 - t 옵션 을 사용 하여 read 명령 을 설정 하여 사용자 가 입력 한 시간 초과 시간 을 읽 을 수 있 습 니 다.지정 한 시간 내 에 입력 한 줄 을 읽 지 않 으 면 read 명령 은 실 패 를 되 돌려 줍 니 다.
예: (위의 스 크 립 트 코드 인지 - t 옵션 만 추가 되 었 습 니 다)
[root@rs1 read]# cat read_2.sh
#提示用户输入用户名,然后将用户的输入赋值给变量username
read -t 7 -p "Enter your name,please: " username
#提示用户输入电话号码,然后赋值给变量email
read -t 5 -p "Enter your tel number,please: " tel
#询问用户是否继续,提示输入y或n,然后将用户输入的内容赋值给input
read -t 5 -p "Are your sure to contuinue?[y/n]" input
case $input in
#如果输入为y或者Y,则显示用户名和电话到标准输出
y|Y)
echo "Your name is : $username"
echo "Your tel number is : $tel "
;;
[nN]*)
echo "Bye"
exit
;;
*)
echo "Just input y or n,please"
exit 1
;;
esac
스 크 립 트 실행:
[root@rs1 read]# bash read_2.sh //正确输入
Enter your name,please: fsx
Enter your tel number,please: 123
Are your sure to contuinue?[y/n]y
Your name is : fsx
Your tel number is : 123
[root@rs1 read]# bash read_2.sh //输入超时
Enter your name,please: Enter your tel number,please: Are your sure to contuinue?[y/n]Just input y or n,please
리 턴 입력 거부
read 명령 은 - s 옵션 을 사용 하여 사용자 의 입력 을 숨 길 수 있 습 니 다.- s 를 지정 하면 터미널 에서 온 입력 이 표시 되 지 않 습 니 다. 이것 은 사용자 비밀번호 등 프라이버시 와 관련 된 검증 에 어느 정도 안전 한 의 미 를 가 집 니 다.
예:
[root@rs1 read]# cat read_3.sh
#定义变量password
password=''
#显示提示输入密码的信息到标准输出
echo "Enter your password: "
#使用while循环隐式地从标准输入每次读取一个字符,且反斜杠不做转义
#将读取的字符赋值给变量char
while IFS= read -r -s -n1 char
do
#如果读入的字符为空(直接输出的空格),则退出while循环
if test -z $char
then
echo
break
fi
#如果输入的是backspace,则从变量password中移除最后一个字符
#并向左删除一个*
#否则,将变量char的值累加赋值给password变量
if [[ $char == $'\x08' ]]
then
#从变量password中移除最后一个字符
[[ -n $password ]] && password=${password:0:${#password}-1}
#并向左删除一个*
printf '\b \b'
else
#将变量char的值累加赋值给变量password
password+=$char
#打印一个星号
printf "*"
fi
done
echo "Password is : $password"
스 크 립 트 실행:
[root@rs1 read]# bash read_3.sh
Enter your password:
***
Password is : fsx
파일 에서 읽 기
read 명령 이 파일 에서 데 이 터 를 읽 는 방법 은 주로 두 가지 가 있 습 니 다.하 나 는 while 순환 이나 until 순환 에서 read 명령 을 사용 하여 파일 설명 자 를 통 해 파일 내용 을 한 줄 한 줄 읽 는 것 입 니 다.다른 하 나 는 for 순환 에서 cat < filename > 을 사용 하여 파일 의 내용 을 읽 는 것 입 니 다.
for 순환 에서 cat < filename > 을 사용 하여 파일 을 읽 는 문법:
for data in $(cat )
do
command1
command2
...
done
filename 은 텍스트 파일 을 대표 합 니 다. 읽 은 내용 을 다시 저장 합 니 다. data. 이 변 수 는 for 순환 에서 사용 하여 읽 은 데 이 터 를 처리 합 니 다.
파일 내용 을 한 줄 씩 읽 으 려 면 IFS 값 을\n 으로 설정 해 야 합 니 다.
예:
[root@rs1 read]# cat read_4.sh ;
#!/bin/bash
#使用变量O_IFS来保存环境变量IFS的值
old_IFS=$IFS
#如果指定的命令行参数个数不为1,则显示脚本使用方法,并退出运行
if test $# -ne 1
then
#显示脚本的使用方法信息
echo "Usage: `basename $0` filename"
#退出脚本
exit 2
fi
#如果指定文件不存在,则显示提示信息,并退出脚本的执行,退出状态码为1
if test ! -f $filename
then
#提示文件不存在
echo "The file $filename does not exist!"
#退出
exit 1
fi
#修改环境变量IFS值,使得for循环里面按行读取文件内容
IFS=$'
'
for line in $(cat $1)
do
echo "$line"
echo "tag#######################################"
done
#恢复IFS的值
IFS=old_IFS
스 크 립 트 실행:
실행 인자 가 없 으 면
[root@rs1 read]# bash read_4.sh
Usage: read_4.sh filename
파일 이 존재 하지 않 는 다 면
[root@rs1 read]# bash read_4.sh 1
The file does not exist!
파일 이 존재 한다 면
[root@rs1 read]# bash read_4.sh 1
#
tag#######################################
# /etc/fstab
tag#######################################
# Created by anaconda on Tue May 22 08:52:29 2018
tag#######################################
#
tag#######################################
# Accessible filesystems, by reference, are maintained under '/dev/disk'
tag#######################################
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
tag#######################################
#
tag#######################################
/dev/mapper/rhel-root / xfs defaults 1 1
tag#######################################
UUID=35ae0b8d-9734-4f72-8a4c-1ae16123f407 /boot xfs defaults 1 2
tag#######################################
/dev/mapper/rhel-swap swap swap defaults 0 0
tag#######################################
while 의 부작용: 각 줄 의 내용 을 읽 으 면 중복 되 는 빈 칸 과 탭 문 자 를 제거 합 니 다. 즉, 각 줄 의 원래 형식 을 제거 합 니 다.for 순환 결합 IFS 는 원본 형식 을 유지 합 니 다.
총결산
함수 로 명령 행 인 자 를 전달 하 는 방법 으로 셸 스 크 립 트 에 인 자 를 전달 할 수 있 습 니 다.전 달 된 명령 행 매개 변 수 는 위치 매개 변수 {$1, $2, $3... ${10}...} 에 저 장 됩 니 다.
특수 변수 '$*' 와 '$@' 은 전 달 된 모든 명령 행 인 자 를 저장 하고 '$\#' 은 전 달 된 명령 행 인자 의 개 수 를 저장 합 니 다 .
하나의 인자 만 받 아들 일 때 케이스 명령 을 사용 하 는 것 이 좋 습 니 다.case 는 Linux 에서 흔히 볼 수 있 는 응용 프로그램 이나 서비스의 시작 스 크 립 트 case 문장의 모든 패턴 이 일치 할 때 대소 문자 가 민감 합 니 다. "shopt - s nocasematch"를 사용 하여 nocasematch 옵션 을 열 수 있 습 니 다 여러 명령 행 인 자 를 사용 할 때 shift 명령 을 사용 하여 한 변수 에서 하나씩 명령 행 인 자 를 가 져 올 수 있 습 니 다 shift 시 Bash 의 내부 명령이 명령 은 전 달 된 매개 변 수 를 왼쪽으로 이동 시 키 는 데 사 용 됩 니 다. 이동 할 때마다 $1 과 $\# 이 변 합 니 다 Shell 스 크 립 트 를 엄밀 하 게 하기 위해 스 크 립 트 시작 부분 에 스 크 립 트 환경 이나 변수 와 검사 하 는 코드 를 작성 합 니 다 getopts 와 getopt 시 명령 행 옵션 과 파 라 메 터 를 전문 적 으로 분석 하 는 도구 read 명령 의 - p 옵션 은 표준 오류 에 알림 정 보 를 표시 하 는 데 사 용 됩 니 다 read 명령 의 - t 옵션 은 사용자 의 입력 시간 초과 를 설정 할 수 있 습 니 다.
read 명령 의 - s 옵션 을 사용 하면 입력 이 표시 되 지 않 음 을 설정 할 수 있 습 니 다.
read 를 사용 하여 파일 의 데 이 터 를 읽 는 방식 은 두 가지 가 있 습 니 다. while/until 순환;for 순환.for 순환 사용 시 IFS 값 주의
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.