스 크 립 트 입력 처리 - 사용자 입력 획득

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 
#!/bin/bash

#提示用户输入用户名,然后将用户的输入赋值给变量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 
#!/bin/bash

#提示用户输入用户名,然后将用户的输入赋值给变量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 
#!/bin/bash

#定义变量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 값 주의

좋은 웹페이지 즐겨찾기