Bash脚本直接接收命令行参数及输入文件内容输出问题求助
问题原因及解决方法
1. 参数打印后自动换行的问题
echo命令默认会在输出内容末尾追加换行符,这是工具的默认行为,要避免换行,使用-n参数即可:
echo -n "$@"
如果后续想要手动控制换行,可以在需要的位置单独执行echo输出空行。
2. 无法输出file_name.txt内容的问题
你执行命令里的<file_name.txt属于标准输入重定向操作,这部分内容不会被识别为脚本的位置参数:
$@变量只能读取到脚本调用时跟在脚本名后面的空格分隔参数,也就是你例子里的5和15- 重定向的文件内容会流入脚本的标准输入流,需要通过读取标准输入的命令才能获取
如果你要保留重定向的写法,只需要在打印参数后追加读取标准输入的逻辑即可,完整测试代码如下:
#!/usr/bin/bash # 打印位置参数,可根据需要选择是否加-n取消换行 echo "$@" # 读取标准输入的所有内容并输出 cat
执行后就会先输出5 15,再输出文件里的abcdefgh。
如果你想把文件名也作为位置参数传入,不需要用重定向的话,调用命令改为./hello.sh 5 15 file_name.txt,此时$3就是文件名,读取内容的代码改为:
#!/usr/bin/bash echo "$1 $2" cat "$3"
核心概念补充
- 位置参数:脚本执行时紧跟在脚本路径后的空格分隔参数,按顺序存储在
$1、$2...${n}变量中,$@代表所有位置参数的集合 - 标准输入重定向:
<符号属于shell的重定向语法,作用是把后续指定文件的内容替换掉当前进程的默认标准输入(默认是键盘输入),和位置参数属于完全独立的两套传递逻辑
内容的提问来源于stack exchange,提问作者Advaita Mallik
相关产品推荐
相关产品推荐

