编写模拟cat命令的my_cat.sh脚本求助
如何编写模拟
cat命令的my_cat.sh脚本? 嘿,作为新手能尝试自己实现命令行工具超棒的!别担心,这个问题其实很基础,咱们一步步来解决。
基础版脚本(支持单个文件参数)
先给你一个能直接工作的my_cat.sh,完全满足你接收第一个参数作为目标文件的需求:
#!/bin/bash # 检查是否传入了文件参数 if [ $# -eq 0 ]; then # 和cat默认行为一致:没有参数时从标准输入读取内容 while IFS= read -r line; do echo "$line" done else # 读取第一个参数指定的文件并输出每一行 while IFS= read -r line; do echo "$line" done < "$1" fi
测试方法
你可以用你提供的示例来验证:
echo Hello > test bash my_cat.sh test执行后就会输出
Hello啦!
脚本解释
#!/bin/bash:这是脚本的"shebang"行,告诉系统用bash解释器来执行这个脚本,必不可少。$#:表示传入脚本的参数个数,[ $# -eq 0 ]就是判断有没有传参数。while IFS= read -r line:这是bash中安全读取文件行的标准写法:IFS=:防止行首或行尾的空格被自动截断-r:防止反斜杠被当作转义字符处理
< "$1":把第一个参数($1)对应的文件作为循环的输入源,实现读取文件内容。
其他解决方法
如果你想让脚本更贴近cat的完整功能,或者想有更简洁的写法,还有这些选择:
方法1:极简版(直接复用cat命令)
这算是"作弊"但非常高效的写法,完全模拟cat的所有行为(包括支持多个文件):
#!/bin/bash cat "$@"
这里$@代表所有传入脚本的参数,所以你可以像用cat一样执行./my_cat.sh file1 file2,效果和原生cat一模一样。
方法2:支持多文件的手动实现
如果你想自己实现多文件处理逻辑,可以用循环遍历所有参数:
#!/bin/bash # 遍历所有传入的文件参数 for file in "$@"; do while IFS= read -r line; do echo "$line" done < "$file" done
新手小提示
- 写完脚本后,记得给它添加执行权限:
chmod +x my_cat.sh,之后就可以直接用./my_cat.sh test执行,不用每次敲bash。 - 如果你之前写的脚本没输出,大概率是这几个原因:
- 没加
#!/bin/bash开头,系统不知道用什么解释器执行 - 没有正确获取参数(比如误用了
$0而不是$1,$0是脚本本身的名字) - 读取文件时没有正确指定输入源,或者循环逻辑有问题
- 没加
内容的提问来源于stack exchange,提问作者al p
相关产品推荐
相关产品推荐

