⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 line-input.bash

📁 UNIX下SH的实现源码
💻 BASH
字号:
#! /bin/bash##From: kaz@cafe.net (Kaz Kylheku)#Newsgroups: comp.unix.shell#Subject: Funky little bash script#Message-ID: <6mspb9$ft2@espresso.cafe.net>#Date: Thu, 25 Jun 1998 06:11:39 GMT#Here is something I wrote a few years ago when I was bored one day.#Warning: this contains control characters.# Line input routine for GNU Bourne-Again Shell# plus terminal-control primitives.## by Kaz Kylheku# June 1996, Vancouver, Canada## Function to disable canonical input processing.# Terminal modes are saved into variable "savetty"##function raw{	savetty=$(stty -g)	stty -icanon -isig -echo -echok -echonl inlcr}## Function to restore terminal settings from savetty variable#function restore{	stty $savetty}## Set terminal MIN and TIME values.# If the input argument is a zero, set up terminal to wait for# a keystroke indefinitely. If the argument is non-zero, set up# an absolute timeout of that many tenths of a second. The inter-keystroke# timer facility of the terminal driver is not exploited.#function settimeout# $1 = tenths of a second{	if [ "$1" = "0" ] ; then		min=1		timeout=0	else		min=0		timeout="$1"	fi	stty min $min time $timeout	unset min timeout}## Input a single key using 'dd' and echo it to standard output.# Launching an external program to get a single keystroke is a bit# of a pig, but it's the best you can do! Maybe we could convince the# GNU guys to make 'dd' a bash builtin.#function getkey{	eval $1="\"\$(dd bs=1 count=1 2> /dev/null)\""}## Input a line of text gracefully.# The first argument is the name of a variable where the input line is# to be stored. If this variable is not empty, its contents are printed# and treated as though the user had entered them.# The second argument gives the maximum length of the input line; if it# is zero, the input is unlimited (bad idea).# ^W is used to delete words# ^R redraws the line at any time by backspacing over it and reprinting it# ^U backspaces to the beginning# ^H or ^? (backspace or del) delete a single character# ^M (enter) terminates the input# all other control keys are ignored and cause a beep when pressed# #function getline{	settimeout 0			# No keystroke timeout.	save_IFS="$IFS"			# Save word delimiter and set it to	IFS=""				# to null so ${#line} works correctly.	eval line=\${$1}		# Fetch line contents	echo -n "$line"			# and print the existing line.	while [ 1 ] ; do		getkey key		# fetch a single keystroke		case "$key" in		 |  )				# BS or DEL			if [ ${#line} != 0 ] ; then	# if line not empty				echo -n " "		# print destructive BS				line="${line%%?}"	# chop last character			else				# else if line empty				echo -n 		# beep the terminal			fi			;;		 )					# kill to line beg			while [ ${#line} != 0 ] ; do	# while line not empty				echo -n " "		# print BS, space, BS				line="${line%?}"	# shorten line by 1			done			;;		 )					# redraw line			linesave="$line"		# save the contents			while [ ${#line} != 0 ] ; do	# kill to line beg				echo -n " "				line="${line%?}"			done			echo -n "$linesave"		# reprint, restore			line="$linesave"			unset linesave			# forget temp var			;;		 )			while [ "${line% }" != "$line" -a ${#line} != 0 ] ; do				echo -n " "				line="${line%?}"			done			while [ "${line% }" = "$line" -a ${#line} != 0 ] ; do				echo -n " "				line="${line%?}"			done			;;		 |  |  |  |  |  |  |  |  |  |  | 
 )			echo -n 	# ignore various control characters			;;		# with an annoying beep		 |  |  |  |  |  |  |  |  |  |  |  |  )			echo -n 			;;		'	' |  |  |  |  |  )			echo -n 			;;		'' )			# Break out of loop on carriage return.			echo		# Send a newline to the terminal.			break		# (Also triggered by NUL char!).			;;		* )		# Append character to the end of the line.				# If length is restricted, and the line is too				# long, then beep...			if [ "$2" != 0 -a $(( ${#line} >= $2 )) = 1 ] ; then				echo -n 			else				# Otherwise add				line="$line$key"	# the character.				echo -n "$key"		# And echo it.			fi			;;		esac	done	eval $1=\"\$line\"	IFS="$save_IFS"	unset line save_IFS}# uncomment the lines below to create a standalone test program#echo "Line input demo for the GNU Bourne-Again Shell."echo "Hacked by Kaz Kylheku"echoecho "Use ^H/Backspace/Del to erase, ^W to kill words, ^U to kill the"echo "whole line of input, ^R to redraw the line."echo "Pass an argument to this program to prime the buffer contents"rawecho -n "go: "if [ ${#1} != 0 ] ; then	LINE=$1figetline LINE 50restoreecho "<$LINE>"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -