Shell数据的读取及打印

9.1 read命令

read 命令的一般形式为:

read variables

该命令执行时,Shell会从标准输入中读取一行,然后将第一个单词分配给variables中列出的第一个变量,第二个单词分配给第二个变量,以此类推。如果行中的单词多于列表中的变量,那么多出的单词全部分配给最后一个变量。例如,下列命令:

read x y

会从标准输入中读入一行,将第一个单词分配给变量x,将行中余下的内容分配给变量y。安照这样的处理逻辑,下列命令:

read text

会读取并将一整行保存到shell变量text中。

9.1.1 文件复制程序

下面编写一个简化版的cp命令程序,借此实践一下read命令。

[root@centos7_c1 linux]# cat mycp 
#
#复制文件
#

if [ "$#" -ne 2 ] ; then
	echo "Usage: mycp from to"
	exit 1
fi

from="$1"
to="$2"

#
#检查目标文件是否已经存在
#

if [ -e "$to" ] ; then
	#echo命令会自动在最后一个参数后面加上一个用于终止的换行符,在echo命令的最后加上特殊转义字符\c可以阻止这种情况
	echo "$to already exists; overwrite (yes/no)? \c"
	read answer

	if [ "$answer" != yes ] ; then
		echo "Copy not performed"
		exit 0
	fi
fi

#
#如果目标文件不存在或者用户输入yes
#

cp $from $to	#执行复制操作
[root@centos7_c1 linux]# 

9.1.4 mycp最终版本

想要mycp接受任意数量的参数,可以使用下面的方法:
1、从命令行中获取除最后一个参数之外的其他参数,将其保存在shell变量filelist中。
2、将最后一个变量保存在变量to中。
3、如果 t o 不 是 目 录 , 则 要 测 试 参 数 数 量 , 这 种 情 况 只 能 有 两 个 参 数 。 4 、 如 果 to不是目录,则要测试参数数量,这种情况只能有两个参数。 4、如果 to4to是目录,对 f i l e l i s t 中 的 每 个 文 件 , 检 查 其 是 否 存 在 于 目 标 目 录 中 。 如 果 不 存 在 , 将 该 文 件 名 加 入 到 变 量 c o p y l i s t 中 。 如 果 存 在 , 询 问 是 否 覆 盖 。 如 果 回 答 y e s , 将 文 件 名 加 入 到 c o p y l i s t 。 5 、 如 果 c o p y l i s t 不 为 空 , 将 其 中 的 文 件 复 制 到 filelist中的每个文件,检查其是否存在于目标目录中。如果不存在,将该文件名加入到变量copylist中。如果存在,询问是否覆盖。如果回答yes,将文件名加入到copylist。 5、如果copylist不为空,将其中的文件复制到 filelistcopylistyescopylist5copylistto中。
下面给出详细代码:

[root@centos7_c1 linux]# cat mycp 
#
#复制文件 最终版
#

numargs=$#
filelist=
copylist=

#
#处理参数,将除最后一个参数之外的其他参数保存在变量filelist中
#

while [ "$#" -gt 1 ] ; do
	filelist="$filelist $1"
	shift
done

to="$1"

#
#如果少于两个参数,或者多于两个参数且最后一个参数不是目录,则发出错误信息
#

if [ "$numargs" -lt 2 -o "$numargs" -gt 2 -a ! -d "$to" ] ; then
	echo "Usage: mycp file1 file2"
	echo "	     mycp file(s) dir"
fi

#
#遍历filelist中的每个文件
#
#

for from in $filelist ; do
	#
	#查看目标文件是否为目录
	#

	if [ -d "$to" ] ; then
		tofile="$to/$(basename $from)"
	else
		tofile="$to"
	fi

	#
	#如果文件不存在或者用户要求进行覆盖,则将其添加到变量copylist中
	#
	
	if [ -e "$tofile" ] ; then
		echo "$tofile already exists; overwrite (yes/no)? \c"
		read answer

		if [ "$answer" = yes ] ; then
			copylist="$copylist $from"
		fi
	else
		copylist="$copylist $from"
	fi
done

#
#进行复制操作——复制之前先判断待复制文件是否为空
#

if [ -n "$copylist" ] ; then
	cp $copylist $to
fi



[root@centos7_c1 linux]# 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春侨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值