Este apéndice contiene listas de referencia para opciones de invocación, comandos incorporados y palabras clave, alias predefinidos, variables de shell incorporadas, operadores de \emph{prueba}, opciones de shell, opciones de \emph{typeset}, aritmética, comandos en modo \emph{emacs} y comandos de control en modo \emph{vi}. Además, describe cómo utilizar todas las facilidades del comando incorporado \emph{getopts}.

\section{Opciones de invocación}
Esta es una lista de las opciones que puede usar cuando invoque al shell Korn. Además de éstas, se puede utilizar cualquier opción establecida en la línea de órdenes; consulte la tabla de opciones más adelante en este apéndice. Los intérpretes de comandos de inicio de sesión suelen invocarse con las opciones \texttt{-i} (interactivo), \texttt{-s} (leer de la entrada estándar) y \texttt{-m} (habilitar el control de trabajos).

\begin{table}[h]
	\center
	\begin{tabular}{|m{2cm}|m{13cm}|} \hline
		\textbf{Opción} & \textbf{Significado} \\ \hline
		-c \emph{string} & Ejecuta \emph{string} y después sale \\\hline
		-D & Imprime todas las cadenas \texttt{\$"..."} del script. Esto se utiliza para crear una base de datos de traducciones específicas de cada idioma de las cadenas de un script. \\\hline
		-i & Shell interactivo. Ignora las señales TERM, INTR y QUIT. \\\hline
		-r & Shell restringido. Ver \hyperref[sec:Chapter10]{Capítulo 10} \\\hline
		-R \emph{filename} & Crea una base de datos de referencias cruzadas para definiciones de variables y comandos en \emph{filename}. No se puede compilar. \\\hline
		-s & Leer comandos de la entrada estándar. Si se proporciona un argumento, esta bandera tiene prioridad (es decir, el argumento no se tratará como un nombre de script y se leerá la entrada estándar). \\\hline
	\end{tabular}
\end{table}

\section{Comandos integrados y palabras clave}
He aquí un resumen de todos los comandos y palabras clave incorporados.

\begin{longtable}[h]{|p{2cm}|p{3.5cm}|p{2cm}|p{7.5cm}|} \hline
		\textbf{Nombre} & \small{\textbf{Comando / Palabra Clave}} & \textbf{Capítulo} & \textbf{Resumen} \\\hline
		\endfirsthead
		\hline
		\textbf{Nombre} & \small{\textbf{Comando / Palabra Clave}} & \textbf{Capítulo} & \textbf{Resumen} \\\hline
		\endhead
		! & Palabra clave & 5 & Invierte el resultado verdadero/falso de la siguiente tubería. \\\hline
		: & Comando & 7 & No hacer nada (sólo hacer expansiones de argumentos). \\\hline
		. & Comando & 4 & Leer archivo y ejecutar su contenido en el shell actual. \\\hline
		alias & Comando & 3 & Establecer la abreviatura de comando o línea de comandos. \\\hline
		bg & Comando & 8 & Poner trabajo en segundo plano. \\\hline
		builtin & Comando & & Añade o elimina comandos incorporados; imprime información sobre ellos. \\\hline
		break & Comando & 5 & Salir del bucle \texttt{for, select, while} o \texttt{until} circundante. \\\hline
		case & Comando & 5 & Construcción condicional multidireccional. \\\hline
		cd & Comando & 1 & Cambiar el directorio de trabajo. \\\hline
		command & Comando & 5 & Localizar comandos integrados y externos; encontrar un comando integrado en lugar de una función con el mismo nombre. \\\hline
		continue & Comando & 4 & Salta a la siguiente iteración del bucle \texttt{for, select, while} o \texttt{until}. \\\hline
		disown & Comando & 8 & Desasociar un trabajo en segundo plano del shell actual. El efecto es que el trabajo no recibe la señal HUP cuando el shell sale. \\\hline
		echo & Comando & 4 & Expandir e imprimir argumentos (obsoleto). \\\hline
		exec & Comando & 9 & Sustituye el shell por el programa dado. \\\hline
		exit & Comando & 5 & Salida del shell. \\\hline
		export & Comando & 3 & Crear variables de entorno. \\\hline
		eval & Comando & 7 & Procesa los argumentos como una línea de comandos. \\\hline
		false & Comando & 8 & No hacer nada y salir sin éxito. Útil para hacer bucles infinitos. \\\hline
		fg & Comando & 8 & Poner el trabajo de fondo en primer plano. \\\hline
		for & Palabra clave & 5 & Construcción en bucle. \\\hline
		function & Palabra clave & 4 & Definir función \\\hline
		getconf & Comando & & Obtener información específica del sistema. Los parámetros están definidos por POSIX. \\\hline
		getopts & Comando & 6 & Opciones de la línea de comandos del proceso. \\\hline
		hist & Palabra clave & 2 & Trabajar con el historial de comandos. \\\hline
		if & Comando & 1 & Construcción condicional. \\\hline
		jobs & Comando & 1 & Enumera los trabajos de fondo. \\\hline
		kill & Comando & 8 & Enviar señal al proceso. \\\hline
		let & Comando & 6 & Asignación aritmética de variables. \\\hline
		newgrp & Comando & & Iniciar nuevo shell con nuevo ID de grupo (obsoleto). \\\hline
		print & Comando & 1 & Expande e imprime los argumentos en la salida estándar. \\\hline
		printf & Comando & 7 & Expande e imprime los argumentos en la salida estándar, utilizando los especificadores de formato \emph{printf(3)} de ANSI C. \\\hline
		pwd & Comando & 1 & Imprimir directorio de trabajo. \\\hline
		read & Comando & 7 & Leer una línea de la entrada estándar. \\\hline
		readonly & Comando & 5 & Hacer que las variables sean de sólo lectura (no asignables). \\\hline
		return & Comando & 5 & Retorno desde función o script circundante. \\\hline
		select & Palabra clave & 5 & Constructo de generación de menús. \\\hline
		set & Comando & 3 & Configura las opciones. \\\hline
		shift & Comando & 6 & Cambia los argumentos de la línea de comandos. \\\hline
		sleep & Comando & 8 & Suspende la ejecución durante el número de segundos indicado. \\\hline
		test & Comando & 5 & Versión antigua del programa de prueba condicional. Utilice \texttt{[[...]]} en su lugar. \\\hline
		time & Palabra clave & & Ejecuta el comando e imprime los tiempos de ejecución. Por sí mismo, imprime los tiempos acumulados para el shell y todos los hijos. \\\hline
		trap & Comando & 8 & Establezca una rutina de captación de señales. \\\hline
		true & Comando & 8 & No hacer nada y salir con éxito. Útil para hacer bucles infinitos. \\\hline
		typeset & Comando & 6 & Establecer características especiales de variables y funciones. \\\hline
		ulimit & Comando & 10 & Establecer/mostrar los límites de recursos del proceso. \\\hline
		umask & Comando & 10 & Establecer/mostrar máscara de permisos de archivo. \\\hline
		unalias & Comando & 3 & Eliminar definiciones de alias. \\\hline
		unset & Comando & 3 & Eliminar definiciones de variables o funciones. \\\hline
		until & Palabra clave & 5 & Construcción en bucle. \\\hline
		wait & Comando & 8 & Espere a que termine(n) la(s) tarea(s) en segundo plano. \\\hline
		whence & Comando & 3 & Identificar la fuente de mando. \\\hline
		while & Palabra clave & 5 & Construcción en bucle. \\\hline
\end{longtable}

Las asignaciones para los comandos \emph{alias, export, readonly} y \emph{typeset} se procesan como asignaciones de variables, en el sentido de que la expansión de tilde se realiza después del carácter =, y la división de campos no se realiza en ninguna sustitución de variable en el valor que se asigna.

\section{Alias predefinidos}
Hay una serie de alias predefinidos, es decir, incorporados automáticamente a \emph{ksh} en tiempo de compilación. Están listados en la siguiente tabla. Tenga en cuenta que algunos de ellos se definen con un carácter de espacio al final. Esto permite la expansión del alias en la palabra que sigue al alias en la línea de comandos.

\begin{table}[h]
	\center
	\begin{tabular}{|m{2cm}|m{2cm}|m{11cm}|} \hline
		\textbf{Nombre} & \textbf{Capítulo} & \textbf{Valor completo} \\ \hline
		autoload & 4, 6 & \texttt{alias autoload='typeset -fu'} \\\hline
		command & 7 & \texttt{alias command='command '} \\\hline
		fc & 2 & \texttt{alias fc=hist} \\\hline
		float & 6 & \texttt{alias float='typeset -E'} \\\hline
		functions & 6 & \texttt{alias functions='typeset -f'} \\\hline
		hash & 3 & \texttt{alias hash='alias -t --'} \\\hline
		history & 2 & \texttt{alias history='hist -l'} \\\hline
		integer & 6 & \texttt{alias integer='typeset -i'} \\\hline
		nameref & 4 & \texttt{alias nameref='typeset -n'} \\\hline
		nohup & 3,8 & \texttt{alias nohup='nohup '} \\\hline
		r & 2 & \texttt{alias r='hist -s'} \\\hline
		redirect & 9 & \texttt{alias redirect='command exec'} \\\hline
		stop & 8 & \texttt{alias stop='kill -s STOP'} \\\hline
		times & & \texttt{alias time='\{ \{time;\} 2>\&1;\}'} \\\hline
		type & 4 & \texttt{alias type='whence -v'} \\\hline
	\end{tabular}
\end{table}

\section{Variables de Shell incorporadas}
He aquí un resumen de todas las variables de shell incorporadas: 

\begin{longtable}[h]{|p{3cm}|p{2cm}|p{10cm}|} \hline
	\textbf{Variable} & \textbf{Capítulo} & \textbf{Significado}\\ \hline
	\endfirsthead
	\hline
	\textbf{Variable} & \textbf{Capítulo} & \textbf{Significado}\\ \hline
	\endhead
	\# & 4 & Número de argumentos dados al proceso actual. \\\hline
	0 & 4 & Argumentos de línea de comandos para el proceso actual. Dentro de comillas dobles, se expande a argumentos individuales. \\\hline
	* & 4 & Argumentos de línea de comandos para el proceso actual. Dentro de comillas dobles, se expande a un único argumento. \\\hline
	- (guión) & & Opciones dadas al shell en la invocación. \\\hline
	? & 5 & Estado de salida del comando anterior. \\\hline
	\$ & 8 & ID de proceso del proceso shell. \\\hline
	\_ (guón bajo) & 3 & Dentro de \texttt{\$MAILPATH:} el nombre de archivo que activó el mensaje <<tienes correo>>. En la línea de comandos: último argumento del comando anterior. Dentro de un script: la ruta completa utilizada para encontrar y ejecutar el script. \\\hline
	! & 8 & ID de proceso del último comando en segundo plano. \\\hline
	.sh.edchar & 10 & Caracteres introducidos al procesar una trampa KEYBD. \\\hline
	.sh.edcol & 10 & Posición del cursor en la trampa KEYBD más reciente. \\\hline
	.sh.edmode & 10 & Igual a ESC en modo \emph{vi}, vacío en caso contrario. \\\hline
	.sh.edtext & 10 & Caracteres en el búfer de entrada durante una trampa KEYBD. \\\hline
	.sh.match & 4 & Variable de matriz con texto que coincide con el patrón en la sustitución de variables. (A partir de \emph{ksh93l}.) \\\hline
	.sh.name & 9 & Nombre de una variable que ejecuta una función de disciplina. \\\hline
	.sh.subscript & 9 & Subíndice de una variable de matriz que ejecuta una función de disciplina. \\\hline
	.sh.value & 9 & Valor de la variable que ejecuta una función de disciplina. \\\hline
	.sh.version & 4, 9 & Versión de \emph{ksh}. \\\hline
	CDPATH & 3 & Lista de directorios en los que debe buscar el comando \emph{cd}. \\\hline
	COLUMNS & 3 & Anchura de visualización en columnas (para los modos de edición y \texttt{select}). \\\hline
	EDITOR & 2 & Se utiliza para establecer el modo de edición; también lo utilizan \emph{mail} y otros programas. Anulado por \texttt{VISUAL}, si está configurado. \\\hline
	EMPV & 3 & Nombre del archivo que se ejecutará como archivo de entorno cuando se invoque al shell. \\\hline
	FCEDIT & 2 & Editor por defecto obsoleto para el comando \emph{hist}. \\\hline
	FIGNORE & 1 & Patrón para los archivos a ignorar durante la expansión del patrón. \\\hline
	FPATH & 4 & Ruta de búsqueda de funciones autocargadas. \\\hline
	HISTCMD & 2 & Número del comando actual en el historial de comandos. \\\hline
	HISTEDIT & 2 & Editor por defecto para el comando \emph{hist} \\\hline
	HISTFILE & 2 & Nombre del archivo de historial de comandos. \\\hline
	HISTSIZE & 2 & Número de líneas guardadas en el archivo histórico. \\\hline
	HOME & 3 & Directorio de inicio (login). \\\hline
	IFS & 7 & Separador de campo interno: lista de caracteres que actúan como separadores de palabras. Normalmente se establece en espacio, TAB y nueva línea. \\\hline
	LANG & & Nombre por defecto de la configuración regional actual; reemplazado por otras variables LC\_*. \\\hline
	LC\_ALL & & Nombre de la configuración regional actual; sustituye a LANG y a las demás variables LC\_*. \\\hline
	LC\_COLLATE & & Nombre de la configuración regional actual para la clasificación de caracteres. \\\hline
	LC\_CTYPE & & Nombre de la configuración regional actual para determinar la clase de caracteres durante la comparación de patrones; véase el \hyperref[sec:Chapter4]{Capítulo 4}. \\\hline
	LC\_NUMERIC & & Nombre de la configuración regional actual para el formato de los números (punto decimal, separador de miles). \\\hline
	LINEO & 9 & Número de línea del script o función que se acaba de ejecutar. \\\hline
	LINES & 3 & Altura de la pantalla en líneas (para el comando \texttt{select}). \\\hline
	MAIL & 3 & Nombre del archivo para comprobar si hay correo nuevo. \\\hline
	MAILCHECK & 3 & Frecuencia (en segundos) con la que se comprueba si hay correo nuevo. \\\hline
	MAILPATH & 3 & Lista de nombres de archivo para comprobar si hay correo nuevo, si MAIL no está configurado. \\\hline
	OLDPWD & 3 & Directorio de trabajo anterior. \\\hline
	OPTARG & 6 & Argumento de la opción procesada por \emph{getopts}. \\\hline
	OPTIND & 6 & Número del primer argumento después de las opciones. \\\hline
	PATH & 3 & Ruta de búsqueda de comandos. \\\hline
	PPID & 8 & ID del proceso padre. \\\hline
	PS1 & 3 & String del símbolo del sistema principal. \\\hline
	PS2 & 3 & String de solicitud de continuación de línea. \\\hline
	PS3 & 5 & String de consulta para el comando \texttt{select}. \\\hline
	PS4 & 9 & String de consulta para la opción \texttt{xtrace}. \\\hline
	PWD & 3 & Directorio de trabajo actual. \\\hline
	RANDOM & 9 & Número aleatorio entre 0 y 32767 ($2^15-1$). \\\hline
	REPLY & 5, 7 & Respuesta del usuario al comando \texttt{select}; resultado del comando \emph{read} si no se dan nombres de variables. \\\hline
	SECONDS & 3 & Número de segundos transcurridos desde que se invocó al shell. \\\hline
	SHELL & 3 & Ruta completa de los programas shell que se deben utilizar para ejecutar comandos. \\\hline
	TMOUT & 5, 7, 10 & Si se establece en un número entero positivo, número de segundos entre comandos tras los cuales el shell termina automáticamente. También se aplica a la lectura de respuestas a \texttt{select} y \emph{read}. \\\hline
	VISUAL & 2 & Permite establecer el modo de edición. \\\hline
\end{longtable}

\section{Operadores de prueba}
Son los operadores que se utilizan con la construcción \texttt{[[...]]}. Pueden combinarse lógicamente con \texttt{\&\&} (\texttt{"}y\texttt{"}) y \texttt{||} (\texttt{"}o\texttt{"}) y agruparse con paréntesis. Cuando se utilizan con nombres de archivo de la forma \texttt{/dev/fd/N}, comprueban el atributo correspondiente del descriptor de archivo abierto \emph{N}. 

\begin{longtable}{|p{4cm}|p{11cm}|} \hline
	\textbf{Operador} & \textbf{Verdadero si} \\ \hline
	\endfirsthead
	\hline
	\textbf{Operador} & \textbf{Verdadero si} \\ \hline
	\endhead
	-a file & \emph{file} existe (Obsoleto. \texttt{-e} es preferido) \\\hline
	-b file & \emph{file} es un dispositivo de bloque \\\hline
	-c file & \emph{file} es un dispositivo de caracteres \\\hline
	-d file & \emph{file} es un directorio \\\hline
	-e file & \emph{file} existe \\\hline
	-f file & \emph{file} es un archivo regular \\\hline
	-g file & \emph{file} tiene activado el bit de \emph{setgid} \\\hline
	-G file & El ID de grupo de \emph{file} es el mismo que el ID de grupo efectivo del intérprete de comandos \\\hline
	-h file & \emph{file} es un enlace simbólico \\\hline
	-k file & \emph{file} tiene su bit \emph{sticky} activado \\\hline
	-l file & \emph{file} es un enlace simbólico. (Solo funciona en sistemas en los que \texttt{/bin/test -l} comprueba si hay enlaces simbólicos \\\hline
	-L file & \emph{file} es un enlace simbólico \\\hline
	-n string & strin no es nulo \\\hline
	-o option & Option está activado \\\hline
	-O file & \emph{file} es propiedad del ID de usuario efectivo del intérprete de comandos \\\hline
	-p file & \emph{file} es una tubería o una tubería con nombre ( archivo FIFO) \\\hline
	-r file & \emph{file} tiene permisos de lectura \\\hline
	-s file & \emph{file} no está vacío \\\hline
	-S file & \emph{file} es un socket \\\hline
	-t file & El descriptor de fichero \emph{N} apunta a una terminal \\\hline
	-u file & \emph{file} tiene activado el bit \emph{setuid} \\\hline
	-w file & \emph{file} tiene permisos de escritura \\\hline
	-x file & \emph{file} tiene permisos de ejecución, o el archivo es un directorio en el que se puede buscar \\\hline
	-z string & \emph{string} es nulo \\\hline
	fileA -nt fileB & fileA es más reciente que file B, o fileB no existe \\\hline
	fileA -ot fileB & fileA es más antiguo que fileB, o fileB no existe \\\hline
	fileA -ef fileB & fileA y fileB apuntan al mismo archivo \\\hline
	string = pattern & \emph{string} coincide con el patrón (que puede contener comodines). Obsoleto; se prefiere == \\\hline
	string == pattern & \emph{String} coincide con el patrón (que puede contener comodines) \\\hline
	string != pattern & String no coincide con el patrón \\\hline
	stringA < stringB & \emph{StringA} está antes que \emph{StringB} en el orden del diccionario \\\hline
	stringA > stringB & \emph{StringA} va después que \emph{StringB} en el orden del diccionario \\\hline
	exprA -eq expB & Las expresiones aritméticas \emph{exprA} y \emph{exprB} son iguales \\\hline
	exprA -ne exprB & Las expresiones aritméticas \emph{exprA} y \emph{exprB} no son iguales \\\hline
	exprA -lt exprB & \emph{exprA} es menor que \emph{exprB} \\\hline
	exprA -gt exprB & \emph{exprA} es mayor que \emph{exprB} \\\hline
	exprA -le exprB & \emph{exprA} es menor o igual que \emph{exprB} \\\hline
	exprA -ge exprB & \emph{exprA} es mayor o igual que \emph{exprB} \\\hline
 \end{longtable}

Los operadores \emph{-eq, -ne, -lt, -le, -gt} y \emph{-ge} se consideran obsoletos en \emph{ksh93}; en su lugar debe utilizarse el comando \emph{let} o \texttt{((...))}. 

Para =, == y !=, cite el patrón para realizar comparaciones literales de strings.

\section{Opciones}
Son opciones que pueden activarse con el comando \texttt{set -o}. Todas están inicialmente desactivadas excepto donde se indique lo contrario. Las abreviaturas, cuando aparecen, son opciones de set que pueden utilizarse en lugar de la orden \texttt{set -o} completa (por ejemplo, \texttt{set -a} es una abreviatura de \texttt{set -o allexport}). En la mayoría de los casos, las abreviaturas son opciones del shell Bourne compatibles con versiones anteriores. Para desactivar una opción, utilice \texttt{set +o nombre largo} o \texttt{set +X}, donde \emph{nombre largo} y \emph{X} son la <<forma larga>> o la forma de <<un solo carácter>> de la opción, respectivamente.

\begin{longtable}[h]{|p{2cm}|p{2.5cm}|p{11.5cm}|} \hline
	\textbf{Opción} & \small{\textbf{Abreviatura}} & \textbf{Significado} \\ \hline
	\endfirsthead
	\hline
	\textbf{Opción} & \small{\textbf{Abreviatura}} & \textbf{Significado} \\ \hline
	\endhead
	allexport & -a & Exporta todas las variables definidas posteriormente. \\\hline
	bgnice & & Ejecuta todos los trabajos en segundo plano con prioridad reducida (activada por defecto). \\\hline
	emacs & & Utilice la edición de línea de comandos estilo Emacs. \\\hline
	errexit & -e & Salir del shell cuando un comando sale con un estado distinto de cero. \\\hline
	gmacs & & Utiliza la edición de línea de comandos al estilo de Emacs, pero con un significado ligeramente diferente para CTRL-T (véase el capítulo 2). \\\hline
	ignoreeof & & No permitir CTRL-D para salir del shell. \\\hline
	keyword & -k & Ejecutar asignaciones en medio de líneas de comando. (Muy obsoleto.) \\\hline
	markdirs & & Añade \texttt{/} a todos los nombres de directorio generados a partir de la expansión de comodines. \\\hline
	monitor & -m & Activar el control de trabajos (activado por defecto). \\\hline
	noclobber & -c & No permitir a > la redirección a archivos existentes. \\\hline
	noexec & -n & Leer los comandos y comprobar si hay errores de sintaxis, pero no los ejecuta. \\\hline
	noglob & -f & Desactivar la expansión de comodines. \\\hline
	nolog & & Desactivar el historial de comandos para las definiciones de funciones. \\\hline
	notify & -b & Imprime mensajes de finalización de trabajo inmediatamente, en lugar de esperar a la siguiente solicitud. \\\hline
	nounset & -u & Tratar las variables indefinidas como errores, no como nulos. \\\hline
	pipefail & & Espera a que se completen todos los trabajos de una cadena. El estado de salida es el del último comando que falló, o cero en caso contrario. (\emph{ksh93g} y posteriores). \\\hline
	privileged & -p & El script se ejecuta en modo \emph{suid}. \\\hline
	trackall & -h & Crea un alias para cada ruta completa encontrada en una búsqueda de comandos. (\emph{ksh93} ignora esta opción; el comportamiento es siempre activado, incluso si esta opción está desactivada). \\\hline
	verbose & -v & Imprime los comandos (textualmente) antes de ejecutarlos. \\\hline
	vi & & Utilice la edición de línea de comandos estilo \emph{vi}. \\\hline
	viraw & & Utilice el modo \emph{vi} y haga que cada pulsación de tecla tenga efecto inmediatamente. (Esto es necesario en algunos sistemas muy antiguos para que el modo \emph{vi} funcione, y es necesario en todos los sistemas para poder usar TAB para completar. A partir de \emph{ksh93n}, se habilita automáticamente cuando se usa \emph{vi-mode}). \\\hline
	xtrace & -x & Imprime los comandos (después de las expansiones) antes de ejecutarlos. \\\hline
\end{longtable}

El comando set tiene algunas opciones adicionales que no tienen sus correspondientes versiones set -o, como se indica a continuación: 

\begin{table}[h]
	\center
	\begin{tabular}{|m{2cm}|m{13cm}|} \hline
		\textbf{Opción} & \textbf{Significado} \\ \hline
		set -A ... & Asignación de matrices indexadas. \\\hline
		set -s & Ordena los parámetros posicionales. \\\hline
		set -t & Leer y ejecutar un comando, y luego salir. (Obsoleto.) \\\hline
	\end{tabular}
\end{table}

\section{Opciones tipográficas}
Estas son las opciones del comando \emph{typeset}. Utilice \texttt{+option} para desactivar una opción, por ejemplo, \texttt{typeset +x foo} para dejar de exportar la variable foo. 

\begin{longtable}[h]{|p{2.5cm}|p{12.5cm}|} \hline
	\textbf{Opción} & \textbf{Significado} \\ \hline
	\endfirsthead
	\hline
	\textbf{Opción} & \textbf{Significado} \\ \hline
	\endhead
	& Sin opción, crear variable local dentro de la función. \\\hline
	-A & Declarar variable como array asociativo. \\\hline
	-E[\emph{n}] & Declara la variable como un número de punto flotante. Opcional \emph{n} es el número de cifras significativas. \\\hline
	-F[\emph{n}] & Declara la variable como un número de punto flotante. Opcional \emph{n} es el número de dígitos significativos. \\\hline
	-f & Sin argumentos, imprime todas las definiciones de funciones. \\\hline
	-f \emph{fname} & Imprime la definición de la función \emph{fname}. \\\hline
	+f & Imprime todos los nombres de las funciones. \\\hline
	-ft & Activar el modo de rastreo para la(s) función(es) nombrada(s). \\\hline
	+ft & Desactiva el modo de rastreo para la(s) función(es) nombrada(s). \\\hline
	-fu & Definir nombre(s) dado(s) como función(es) \emph{autoloaded}. \\\hline
	-fx & Obsoleto; no hace nada en \emph{ksh93}. \\\hline
	-H & Asignación de nombres de archivo de Unix a host para sistemas no Unix. \\\hline
	-i[\emph{n}] & Declara la variable como un entero. Opcional \emph{n} es la base de salida. \\\hline
	-l & Convierte todas las letras a minúsculas. \\\hline
	-L & Justificar a la izquierda y eliminar los espacios a la izquierda. \\\hline
	-n & Declarar variable como \emph{nameref}. \\\hline
	-p & Imprime comandos \emph{tipográficos} (\emph{typeset}) para volver a crear variables con los mismos atributos. \\\hline
	-r & Hacer que la variable sea de sólo lectura. \\\hline
	-R & Justificar a la derecha y eliminar los espacios finales. \\\hline
	-t & Etiquetar la variable. (Obsoleto.) \\\hline
	-u & Convierte todas las letras a mayúsculas. \\\hline
	-ui[\emph{n}] & Declara la variable como un entero sin signo. Opcional \emph{n} es la base de salida. (\emph{ksh93m} y posteriores). \\\hline
	-x & Variable de exportación, es decir, poner en el entorno para que se pase a los subprocesos. \\\hline
	-Z[\emph{n}] & Justificar a la derecha y rellenar con ceros a la izquierda. \emph{n} es la anchura, o la anchura se establece a partir del valor utilizado en la primera asignación. \\\hline
\end{longtable}

\section{Aritmética}
A partir de \emph{ksh93m}, la instalación de aritmética incorporada comprende un gran porcentaje de las expresiones del lenguaje C. Esto hace que el shell sea más atractivo como un lenguaje de programación completo. Las siguientes características están disponibles:

\emph{Sufijos de tipo al final}\\
Las constantes enteras pueden tener un sufijo \texttt{U} o \texttt{L} al final para indicar que son sin signo o largas, respectivamente. Aunque las versiones en minúsculas también se pueden usar, esto no se recomienda, ya que es fácil confundir una \texttt{l} (ele minúscula) con un 1 (uno).

\emph{Constantes de caracteres en C} \\
Se reconocen las constantes de caracteres individuales en C, entre comillas simples. Al igual que en C, actúan como constantes enteras. Por ejemplo:

\begin{lstlisting}[language=bash]
$ typeset -i c
$ for ((c = 'a'; c <= 'z'; c++))
> do print $c
> done
97 
98 
99 
100 
...
\end{lstlisting}

\emph{Constantes octales y hexadecimales} \\
Puedes utilizar el formato C para constantes octales (base 8) y hexadecimales (base 16). Las constantes octales comienzan con un 0 líder, y las constantes hexadecimales comienzan con un \texttt{0x} o \texttt{0X} líder. Por ejemplo:

\begin{lstlisting}[language=bash]
$ print $((010 + 1))         # Octal 10 es decimal 8 
9
$ print $((0x10 + 1))        # Hexadecimal 10 es decimal 16 
17
\end{lstlisting}

\emph{Aritmética con enteros sin signo} \\
Al usar \texttt{typeset -ui}, puedes crear enteros sin signo. Los enteros regulares representan números positivos y negativos. Los enteros sin signo comienzan en 0, llegan hasta algún valor dependiente de la implementación y luego <<se envuelven>> nuevamente a 0. Del mismo modo, restar 1 de 0 se envuelve en la otra dirección, dando como resultado el número sin signo más grande:

\begin{lstlisting}[language=bash]
$ typeset -ui u=0
$ let u--
$ print $u
4294967295
\end{lstlisting}

\emph{Operadores y precedencia en C} \\
\emph{ksh} admite el conjunto completo de operadores en C, con la misma precedencia y asociatividad. Los operadores se presentaron en detalle en el \hyperref[sec:Chapter6]{Capítulo 6} y se resumen nuevamente a continuación.

\begin{longtable}[h]{|p{5cm}|p{6cm}|p{4cm}|} \hline
	\textbf{Operador} & \textbf{Significado} & \textbf{Asociatividad} \\\hline
	\endfirsthead
	\hline
	\textbf{Operador} & \textbf{Significado} & \textbf{Asociatividad} \\\hline
	\endhead
	\texttt{++ --} & Incremento y decremento, prefijo y postfijo & De izquierda a derecha \\\hline
	\texttt{+ - ! \~{}} & Más y menos unarios; negación lógica y por bits & De derecha a izquierda \\\hline
	\texttt{**} & Exponenciación \tablefootnote{\emph{ksh93m} y versiones más recientes. El operador ** no está en el lenguaje C.} & De derecha a izquierda \\\hline
	\texttt{* ? / \%} & Multiplicación, división y resta & De izquierda a derecha \\\hline
	\texttt{+ -} & Suma y resta & De izquierda a derecha \\\hline
	\texttt{<< >>} & Desplazamiento de bits a izquierda y derecha & De izquierda a derecha \\\hline
	\texttt{< <= > >=} & Comparaciones & De izquierda a derecha \\\hline
	\texttt{== !=} & Iguales y no iguales & De izquierda a derecha \\\hline
	\texttt{\&} & Bit a bit <<y>> & De izquierda a derecha \\\hline
	\texttt{\^{}} & <<O>> exlusivo bit a bit & de Izquierda a derecha \\\hline
	\texttt{|} & Bit a bit <<o>> & De izquierda a derecha \\\hline
	\texttt{\&\&} & AND lógico & De izquierda a derecha \\\hline
	\texttt{||} & OR lógico & De izquierda a derecha \\\hline
	\texttt{?:} & Expresión condicional & De derecha a izquierda \\\hline
	\texttt{= += -= *= /= \%= \&= \^{}= <<= >>=} & Operadores de asignación & De derecha a izquierda \\\hline
	\texttt{,} & Evaluación secuencial & De izquierda a derecha \\\hline
\end{longtable}

\section{Comandos del modo Emacs}
Aquí tienes una lista completa de todos los comandos del modo de edición de emacs. Algunos de estos, como \texttt{ESC [ A,} representan secuencias de teclas de flecha de terminal estándar ANSI; se agregaron para \emph{ksh93h}.

\begin{longtable}[h]{|p{3cm}|p{12cm}|} \hline
	\textbf{Comando} & \textbf{Significado} \\\hline
	\endfirsthead
	\hline
	\textbf{Comando} & \textbf{Significado} \\\hline
	\endhead
	CTRL-A & Mover al principio de la línea \\\hline
	CTRL-B & Retroceder un carácter sin borrar \\\hline
	CTRL-C & Capitalizar el carácter después del punto \\\hline
	CTRL-D & Borrar un carácter hacia adelante \\\hline
	CTRL-E & Mover al final de la línea \\\hline
	CTRL-F & Avanzar un carácter \\\hline
	CTRL-I (TAB) & Completar el nombre de archivo en la palabra actual (a partir de \emph{ksh93h}) \\\hline
	CTRL-J & Igual que ENTER. \\\hline
	CTRL-K & Borrar (<<kill>>) hacia adelante hasta el final de la línea \\\hline
	CTRL-L & Limpiar pantalla \\\hline
	CTRL-M & Igual que ENTER \\\hline
	CTRL-N & Línea siguiente \\\hline
	CTRL-O & Igual que ENTER, luego muestra la línea siguiente en el archivo de historial \\\hline
	CTRL-P & Línea anterior \\\hline
	CTRL-R & Buscar hacia atrás \\\hline
	CTRL-T & Intercambiar los dos caracteres a cada lado del punto \\\hline
	CTRL-U & Repetir el siguiente comando cuatro veces \\\hline
	CTRL-V & Imprimir la versión del shell Korn \\\hline
	CTRL-W & Borrar (<<wipe>>) todos los caracteres entre el punto y la marca \\\hline
	CTRL-X CTRL-E & Invocar el programa emacs en el comando actual \\\hline
	CTRL-X CTRL-X & Intercambiar el punto y la marca \\\hline
	CTRL-Y & Recuperar (<<yank>>) el último elemento eliminado \\\hline
	CTRL-] x & Buscar hacia adelante x, donde x es cualquier carácter \\\hline
	CTRL-@ & Establecer la marca en el punto \\\hline
	DEL & Borrar un carácter hacia atrás \\\hline
	CTRL-[ & Igual que ESC (en la mayoría de los teclados) \\\hline
	ESC b & Mover una palabra hacia atrás \\\hline
	ESC c & Cambiar la palabra después del punto a mayúsculas \\\hline
	ESC d & Borrar una palabra hacia adelante \\\hline
	ESC f & Mover una palabra hacia adelante \\\hline
	ESC h & Borrar una palabra hacia atrás \\\hline
	ESC l & Cambiar la palabra después del punto a minúsculas \\\hline
	ESC p & Guardar caracteres entre el punto y la marca como si estuvieran borrados \\\hline
	ESC CTRL-H & Borrar una palabra hacia atrás \\\hline
	ESC CTRL-] x & Buscar hacia atrás x, donde x es cualquier carácter \\\hline
	ESC ESPACIO & Establecer la marca en el punto \\\hline
	ESC \# & Insertar línea en el archivo de historial para edición futura \\\hline
	ESC DEL & Borrar una palabra hacia atrás \\\hline
	ESC < & Mover al principio del archivo de historial \\\hline
	ESC > & Mover al final del archivo de historial \\\hline
	ESC . & Insertar última palabra en la línea de comando anterior después del punto \\\hline
	ESC \_ & Igual que arriba \\\hline
	ESC ESC & Hacer la completación de nombre de archivo/comando/variable en la palabra actual \\\hline
	ESC * & Hacer la expansión de nombre de archivo/comando/variable en la palabra actual \\\hline
	ESC = & Hacer la lista de nombre de archivo/comando/variable en la palabra actual \\\hline
	ESC [ A & Línea anterior (\emph{ksh93h} y más reciente) \\\hline
	ESC [ B & Línea siguiente (\emph{ksh93h} y más reciente) \\\hline
	ESC [ C & Mover un carácter hacia adelante (\emph{ksh93h} y más reciente) \\\hline
	ESC [ D & Mover un carácter hacia atrás (sin borrar) (\emph{ksh93h} y más reciente) \\\hline
	ESC [ H & Mover al principio de la línea (\emph{ksh93h} y más reciente) \\\hline
	ESC [ Y & Mover al final de la línea (\emph{ksh93h} y más reciente) \\\hline
	Kill & El carácter de eliminación \emph{stty(1)}, a menudo CTRL-U o @ o CTRL-X. Esto borra todo en la línea. Escribirlo dos veces activa el modo <<line feed>>, que emite un carácter de avance de línea para empezar en una nueva línea. Esto es apropiado para terminales solo de papel. \\\hline
\end{longtable}

\section{Comandos del modo de control vi}
Aquí tienes una lista completa de todos los comandos de control en el modo \emph{vi}. Al igual que con los comandos del modo \emph{emacs}, las secuencias como \texttt{[ A} son para las teclas de flecha estándar ANSI y se agregaron para \emph{ksh93h}.

\begin{longtable}[h]{|p{3cm}|p{12cm}|} \hline
	\textbf{Comando} & \textbf{Significado} \\\hline
	\endfirsthead
	\hline
	\textbf{Comando} & \textbf{Significado} \\\hline
	\endhead
h & Mover a la izquierda un carácter \\\hline
[ & D Mover a la izquierda un carácter (\emph{ksh93h} y más reciente) \\\hline
l & Mover a la derecha un carácter \\\hline
space & Mover a la derecha un carácter \\\hline
[ C & Mover a la derecha un carácter (\emph{ksh93h} y más reciente) \\\hline
w & Mover a la derecha una palabra \\\hline
b & Mover a la izquierda una palabra \\\hline
W & Mover al principio de la siguiente palabra no en blanco \\\hline
B & Mover al principio de la palabra no en blanco precedente \\\hline
e & Mover al final de la palabra actual \\\hline
E & Mover al final de la palabra actual no en blanco \\\hline
0 & Mover al principio de la línea \\\hline
[ H & Mover al principio de la línea (\emph{ksh93h} y más reciente) \\\hline
\^{} & Mover al primer carácter no en blanco en la línea \\\hline
\$ & Mover al final de la línea \\\hline
[ Y & Mover al final de la línea (\emph{ksh93h} y más reciente) \\\hline
i & Insertar texto antes del carácter actual \\\hline
a & Insertar texto después del carácter actual \\\hline
I & Insertar texto al principio de la línea \\\hline
A & Insertar texto al final de la línea \\\hline
r & Reemplazar un carácter (no entra en modo de entrada) \\\hline
R & Sobrescribir el texto existente \\\hline
dh & Eliminar un carácter hacia atrás \\\hline
dl & Eliminar un carácter hacia adelante \\\hline
db & Eliminar una palabra hacia atrás \\\hline
dw & Eliminar una palabra hacia adelante \\\hline
dB & Eliminar una palabra no en blanco hacia atrás \\\hline
dW & Eliminar una palabra no en blanco hacia adelante \\\hline
d\$ & Eliminar hasta el final de la línea \\\hline
d0 & Eliminar hasta el principio de la línea \\\hline
D & Equivalente a d\$ (eliminar hasta el final de la línea) \\\hline
dd & Equivalente a 0d\$ (eliminar toda la línea) \\\hline
C & Equivalente a c\$ (eliminar hasta el final de la línea, entrar en modo de entrada) \\\hline
cc & Equivalente a 0\$ (eliminar toda la línea, entrar en modo de entrada) \\\hline
s & Equivalente a xi (eliminar el carácter actual, entrar en modo de entrada) \\\hline
S & Equivalente a cc (eliminar toda la línea, entrar en modo de entrada) \\\hline
x & Equivalente a dl (eliminar carácter hacia atrás) \\\hline
X & Equivalente a dh (eliminar carácter hacia adelante) \\\hline
k o - & Mover hacia atrás una línea [ A Mover hacia atrás una línea (\emph{ksh93h}  y más reciente) \\\hline
j o + & Mover hacia adelante una línea \\\hline
[ B & Mover hacia adelante una línea (\emph{ksh93h} y más reciente) \\\hline
G & Mover a la línea dada por el recuento de repeticiones \\\hline
/string & Buscar hacia adelante la cadena \\\hline
?string & Buscar hacia atrás la cadena \\\hline
n & Repetir la búsqueda hacia adelante \\\hline
N & Repetir la búsqueda hacia atrás \\\hline
f x & Mover a la siguiente ocurrencia de x hacia la derecha \\\hline
F x & Mover a la ocurrencia anterior de x hacia la izquierda \\\hline
t x & Mover a la siguiente ocurrencia de x hacia la derecha, luego hacia atrás un espacio \\\hline
T x & Mover a la ocurrencia anterior de x hacia la izquierda, luego hacia adelante un espacio \\\hline
yh & Yankar un carácter hacia atrás \\\hline
yl & Yankar un carácter hacia adelante \\\hline
yb & Yankar una palabra hacia atrás \\\hline
yw & Yankar una palabra hacia adelante \\\hline
yB & Yankar una palabra no en blanco hacia atrás \\\hline
yW & Yankar una palabra no en blanco hacia adelante \\\hline
y\$ & Yankar hasta el final de la línea \\\hline
y0 & Yankar hasta el principio de la línea \\\hline
Y & Equivalente a y\$ (yankar hasta el final de la línea) \\\hline
yy & Equivalente a 0y\$ (yankar toda la línea) \\\hline
u & Deshacer el último cambio de edición \\\hline
U & Deshacer todos los cambios de edición realizados en la línea \\\hline
. (punto) & Repetir el último comando de edición \\\hline
| & Mover a la posición absoluta de la columna \\\hline
; & Rehacer el último comando de búsqueda de caracteres \\\hline
, & Rehacer el último comando de búsqueda de caracteres, pero en dirección opuesta \\\hline
\% & Mover a la coincidencia de (, ), \{, \}, [, o ] \\\hline
\textbackslash{} & Realizar la completación de nombre de archivo/comando/variable \\\hline
CTRL-I (TAB) & Realizar la completación de nombre de archivo/comando/variable (solo para \texttt{set -o viraw}) (a partir de \emph{ksh93h}) \\\hline
* & Realizar la expansión de nombre de archivo/comando/variable (en la línea de comandos) \\\hline
= & Realizar la expansión de nombre de archivo/comando/variable (como lista impresa) \\\hline
\~{} & Invertir (<<twiddle>>) mayúsculas y minúsculas del carácter actual \\\hline
\_ & Anexar la última palabra del comando anterior, entrar en modo de entrada \\\hline
v & Ejecutar el comando hist en la línea actual (en realidad, ejecutar el comando \texttt{hist -e \$\{VISUAL:-\$\{EDITOR:-vi\}\}}); generalmente esto significa ejecutar \emph{vi} completo en la línea actual \\\hline
CTRL-J & Igual que ENTER \\\hline
CTRL-L & Iniciar una nueva línea y volver a dibujar la línea actual en ella \\\hline
CTRL-M & Igual que ENTER \\\hline
CTRL-V & Imprimir la versión del shell Korn \\\hline
\# & Agregar \# (carácter de comentario) a la línea y enviarlo. Si la línea comienza con \#, quitar el \# inicial y todos los \# iniciales después de cualquier salto de línea incrustado \\\hline
@ x & Insertar expansión de alias \_x como entrada de modo de comando \\\hline
\end{longtable}

\section{Uso de getopts}
El comando \emph{getopts} es extremadamente capaz. Con él, puedes hacer que tus scripts de shell acepten opciones largas, especificar que los argumentos son opcionales o numéricos, y proporcionar descripciones de los argumentos y valores para que las opciones \texttt{-?, --man, --html} y \texttt{--nroff} funcionen de la misma manera para tu programa que para los comandos internos de \emph{ksh93}.

El precio por este poder es la complejidad del <<lenguaje>> de descripción de opciones. Basándonos en una descripción proporcionada por el Dr. Glenn Fowler de AT\&T Research, describimos cómo evolucionaron las facilidades, cómo funcionan y resumimos cómo usarlas en tus propios programas. Usamos el comando getopts extendido en la solución para la \hyperref[box:B-1]{Tarea B-1}.

\begin{mybox}[Tarea B-1]\label{box:B-1}
Diseña el programa \emph{phaser4}, que combina las características de los programas \emph{phaser3} y \emph{tricorder}. Asegúrate de que sea autosuficiente.\footnote{No, las paredes de mi habitación no están cubiertas de pósters de Star Trek. Superé eso hace mucho tiempo, y además, mi esposa no me dejaría de todos modos. ADR.}
\end{mybox}

El primer paso es describir las opciones. Esto se hace con un comentario en la parte superior del script:

\begin{lstlisting}[language=bash]
# uso: phaser4 [ opciones ] archivos
# -k, --kill                  usar configuración de eliminación (predeterminado)
# -l n, --level n             establecer el nivel del phaser (predeterminado = 2)
# -s, --stun                  usar configuración solo de aturdimiento
# -t [lf], --tricorder [lf]   modo tricorder, escaneo opcional para forma de vida lf
\end{lstlisting}

Ahora comienza la diversión. Este esquema de capacidades sigue el orden en que se agregaron funciones a \emph{getopts}.

\begin{enumerate}
	\item Comienza con el comando \emph{getopts} como se describe en el \hyperref[sec:Chapter6]{Capítulo 6}. Esto produce una cadena de opciones simple que solo permite opciones de una sola letra:

\begin{lstlisting}[language=bash]
USAGE="kl#st:"
while getopts "$USAGE" optchar ...
\end{lstlisting}

	\item Añade una descripción textual para el argumento de opción. Esto se hace encerrando texto arbitrario entre [ y ]:

\begin{lstlisting}[language=bash]
USAGE="kl#[level]st:[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}

	\item Permite un valor predeterminado para el argumento de una opción. Esto se hace especificando \texttt{:= value} dentro de la descripción entre corchetes:

\begin{lstlisting}[language=bash]
USAGE="kl#[level:=2]st:[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}

	\item Añade ? después de : para indicar un argumento opcional:

\begin{lstlisting}[language=bash]
USAGE="kl#[level:=2]st:?[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}

	\item Permite opciones largas que comienzan con \texttt{--}. Esto se hace usando \texttt{[let:long]} en lugar de la única letra de opción:

\begin{lstlisting}[language=bash]
USAGE="[k:kill]"
USAGE+="[l:level]#[level:=2]"
USAGE+="[s:stun]"
USAGE+="[t:tricorder]:?[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}

Aquí, hemos dividido cada opción en su propia línea para facilitar el seguimiento y las hemos concatenado usando el operador de asignación +=. Ten en cuenta que no hay saltos de línea en la cadena.

	\item Dentro de los corchetes cuadrados de una letra de opción, permite que siga un texto descriptivo después de un signo de interrogación. Este texto se ignora, al igual que cualquier carácter de espacio en blanco, incluidos los saltos de línea:

\begin{lstlisting}[language=bash]
USAGE="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}

	\item Ahora se pone interesante. Los encabezados de sección al estilo de la página man de Unix vienen \emph{antes} de la descripción de la opción. Se distinguen de las descripciones de las opciones al comenzar con un + dentro de corchetes cuadrados:

\begin{lstlisting}[language=bash]
USAGE="[+NOMBRE?phaser4 --- phaser y tricorder combinados]"
USAGE+="[+DESCRIPCIÓN?El programa phaser4 combina la operación "
USAGE+="de los programas phaser3 y tricorder en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}

Observa que \emph{getopts} comprende automáticamente que la descripción real de las opciones viene después de los encabezados de la página man; no hay un explícito \texttt{[+OPTIONS?...]} en el texto del string.

	\item Se puede proporcionar texto adicional descriptivo para el resumen de uso corto después de la descripción de las opciones, separado por dos saltos de línea:

\begin{lstlisting}[language=bash]
USAGE="[+NOMBRE?phaser4 --- phaser y tricorder combinados]"
USAGE+="[+DESCRIPCIÓN?El programa phaser4 combina la operación "
USAGE+="de los programas phaser3 y tricorder en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
USAGE+=$'\n\narchivo ...\n\n'   # Usa cadena ANSI C para el carácter \n
USAGE+="[+VER TAMBIÉN?phaser3(1), tricorder(1)]"
while getopts "$USAGE" optchar ...
\end{lstlisting}

	\item Para indicar texto que debe cursivarse, enciérralo entre pares de caracteres \textbackslash{}a. Para indicar texto que debe ponerse en negrita, enciérralo entre pares de caracteres \textbackslash{}b:

\begin{lstlisting}[language=bash]
USAGE="[+NOMBRE?phaser4 --- phaser y tricorder combinados]"
USAGE+="[+DESCRIPCIÓN?El programa \aphaser4\a combina la operación "
USAGE+="de los programas \aphaser3\a y \atricorder\a en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
USAGE+=$'\n\narchivo ...\n\n'   # Usa cadena ANSI C para el carácter \n
USAGE+=$'[+VER TAMBIÉN?\aphaser3\a(1), \atricorder\a(1)]'
while getopts "$USAGE" optchar ...
\end{lstlisting}

	\item Es posible un control dinámico de la salida descriptiva. Para hacer esto, escribe una función que imprima lo que desees y luego encierra el nombre de la función entre un par de caracteres \textbackslash{}f: \textbackslash{}fname\textbackslash{}f (esto no es necesario para phaser4).

	\item Si una opción (o cualquier otra cosa) necesita una descripción detallada, encerrar el texto entre { y } crea una lista sangrada. Esto es particularmente útil para describir diferentes valores de opción:

\begin{lstlisting}[language=bash]
USAGE="[+NOMBRE?phaser4 --- phaser y tricorder combinados]"
USAGE+="[+DESCRIPCIÓN?El programa \aphaser4\a combina la operación "
USAGE+="de los programas \aphaser3\a y \atricorder\a en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]{ Añadir descripciones de valores
                 [level=0-2?configuraciones no letales] 
                 [level=3-10?letales, usar con precaución] 
}"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
USAGE+=$'\n\narchivo ...\n\n'   # Usa cadena ANSI C para el carácter \n
USAGE+=$'[+VER TAMBIÉN?\aphaser3\a(1), \atricorder\a(1)]'
while getopts "$USAGE" optchar ...
\end{lstlisting}

	\item Casi terminado. El texto entre corchetes cuadrados que comienza con un signo menos proporciona información de versión e identificación. Tal texto va al principio. El ítem vacío indica una versión y puede contener tanto cadenas de SCCS como de RCS, como se muestra aquí:

\begin{lstlisting}[language=bash]
USAGE=$'[-?\n@(#)$Id: phaser4 (Investigación y Desarrollo de la Flota Estelar)'
USAGE+=$' Stardate 57234.22 $\n]'
USAGE+="[-autor?J. Programador ]"
USAGE+="[-derechos?Copyright (c) Stardate 57000 Flota Estelar.]"
USAGE+="[-licencia?http://www.starfleet.mil.fed/weapons-license.xml23]"
USAGE+="[+NOMBRE?phaser4 --- phaser y tricorder combinados]"
USAGE+="[+DESCRIPCIÓN?El programa \aphaser4\a combina la operación "
USAGE+="de los programas \aphaser3\a y \atricorder\a en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]{ 
                 [level=0-2?configuraciones no letales] 
                 [level=3-10?letales, usar con precaución] 
}"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
USAGE+=$'\n\narchivo ...\n\n'   # Usa cadena ANSI C para el carácter \n
USAGE+=$'[+VER TAMBIÉN?\aphaser3\a(1), \atricorder\a(1)]'
while getopts "$USAGE" optchar ...
\end{lstlisting}

	\item Finalmente, permite escapes dentro de las cadenas. \texttt{]]} representa un corchete de cierre literal cuando \emph{getopts} de otra manera podría interpretarlo como un corchete de cierre. De manera similar, ?? representa un signo de interrogación literal que de otra manera podría iniciar una descripción.
\end{enumerate}

Uff, ¡eso es mucha información! Sin embargo, verlo en el orden en que se agregó ayuda a que tenga sentido. Aquí tienes un resumen de los elementos que van en la cadena de uso, en el orden que requiere `getopts`:

\begin{enumerate}
	\item Las cadenas de identificación para la versión, autor, licencia, etc., son la primera parte. Están encerradas en corchetes y comienzan con un signo menos. El nombre del ítem, como <<author>>, sigue el signo menos y termina en un signo de interrogación. Después del signo de interrogación viene la información asociada.
	
El ítem vacío indica información de versión y debe tener la forma mostrada anteriormente; \emph{getopts} elimina los caracteres de identificación especiales de SCCS y RCS.

	\item Las secciones y el texto de estilo de la página de manual de Unix vienen a continuación. Están encerrados en corchetes y comienzan con un signo más. El nombre de la sección termina en el carácter ?, y el texto descriptivo sigue.

El texto separado por dos nuevas líneas desde la descripción de las opciones se añade al mensaje breve de uso.

	\item Las descripciones de las opciones forman la tercera sección. Todavía se permite la forma corta original, como se describió en el \hyperref[sec:Chapter6]{Capítulo 6}:
	\begin{itemize}
		\item Usa : para opciones que requieren argumentos.
		\item Usa \# para opciones que requieren argumentos numéricos.
		\item Usa :? y \#? para opciones que permiten argumentos pero no los requieren.
	\end{itemize}

	\item Sigue las opciones con un texto descriptivo entre [ y ]. Usa := dentro del texto descriptivo para especificar un valor predeterminado para un argumento de opción.
	\item Las opciones largas se emparejan con una letra de opción corta encerrándolas entre corchetes y separándolas por dos puntos. Esto reemplaza la forma de una sola letra.
	\item Encierra entre dos caracteres \texttt{\textbackslash{}a} los elementos que se deben cursivar. Encierra entre dos caracteres \texttt{\textbackslash{}\b} los elementos que se deben poner en negrita. Encierra el nombre de una función de personalización a llamar entre dos caracteres \texttt{\textbackslash{}f}.
	\item Usa \{ y \} para encerrar descripciones de opciones anidadas e indentadas.
	\item Sigue la sección de opciones con dos nuevas líneas y texto adicional para el resumen de las opciones cortas.
	\item Usa \texttt{]]} para representar un corchete de cierre literal y \texttt{??} para representar un signo de interrogación literal.
\end{enumerate}

Aquí está la versión esquelética de \emph{phaser4}:

\begin{lstlisting}[language=bash]
#! /bin/ksh

# uso: phaser4 [ opciones ] archivos
# -k, --kill                        usa la configuración de matar (predeterminado)
# -l n, --level n                   establece el nivel del phaser (predeterminado = 2)
# -s, --stun                        usa la configuración de aturdir
# -t [lf], --tricorder [lf]         modo tricorder, escaneo opcional para la forma de vida lf

USAGE=$'[-?\n@(#)$Id: phaser4 (Investigación y Desarrollo de la Flota Estelar)' 
USAGE+=$' Fecha estelar 57234.22 $\n]' 
USAGE+="[-autor?J. Programador <J.Prog@r-d.starfleet.mil.fed>]" 
USAGE+="[-copyright=Derechos de autor (c) Fecha estelar 57000 Flota Estelar.]" 
USAGE+="[-licencia?http://www.flotaestelar.mil.fed/licencia-armas.xml23]" 
USAGE+="[+NOMBRE?phaser4 --- combinación de phaser y tricorder]" 
USAGE+="[+DESCRIPCIÓN?El programa \aphaser4\a combina la operación " 
USAGE+="de los programas \aphaser3\a y \atricorder\a en una herramienta práctica.]" 
USAGE+="[k:kill?Usar configuración de matar (predeterminado).]" 
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]{ 
              [0-2?configuraciones no letales] 
              [3-10?letales, usar con precaución] 
}" 
USAGE+="[s:stun?Solo aturdir.]" 
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]" 
USAGE+=$'\n\narchivo ...\n\n' 
USAGE+=$'[+VER TAMBIÉN?\aphaser3\a(1), \atricorder\a(1)]' 

kill=1 aturdir=0 nivel=2             # valores predeterminados
tricorder=0 phaser=1 
life_form= 
while getopts "$USAGE" optchar ; do 
  case $optchar in 
    k) kill=1 aturdir=0 ;; 
    s) kill=0 aturdir=1 ;; 
    l) level=$OPTARG 
       if ((level < 0)) ; then 
         level=0 ; 
       fi 
       if ((level > 10)) ; then 
         level=10 ; 
       fi 
       ;; 
    t) phaser=0 tricorder=1 
       life_form=${OPTARG:-"desconocido_general"} 
       ;; 
  esac 
done 

print kill=$kill 
print aturdir=$aturdir 
print level=$level 
print phaser=$phaser 
print tricorder=$tricorder 
print life_form=$life_form
\end{lstlisting}

Aquí está la salida de \texttt{phaser4 --man}:

\begin{lstlisting}[language=bash]

NAME
    phaser4 --- combinación de phaser y tricorder

SYNOPSIS
    phaser4 [ opciones ] archivo ...

DESCRIPTION
    El programa phaser4 combina la operación de los programas phaser3 y tricorder 
    en una herramienta práctica.

OPTIONS
    -k, --kill          Usar configuración de kill (predeterminado).
    -l, --level=level   Establecer el level del phaser.
                           level=0-2
                                 configuraciones no letales
                           level=3-10
                                 letales, usar con precaución
                        El valor predeterminado es 2.
-s, --stun              Solo aturdir.
-t, --tricorder[=life_form]
                        Modo tricorder. El valor de la opción puede omitirse.

SEE ALSO
    phaser3(1), tricorder(1)

IMPLEMENTATION
    version             phaser4 (Investigación y Desarrollo de la Flota Estelar) Fecha estelar 
                        57234.22
    autor               J. Programador
    copyright           Copyright (c) Fecha estelar 57000 Flota Estelar.
    license             http://www.flotaestelar.mil.fed/licencia-armas.xml23
\end{lstlisting}
