Bash脚本携带参数执行时无法识别命令行参数如何解决
Bash脚本自定义函数无法读取命令行参数问题修复
问题原因
Bash 中的位置参数($1、$#、$@等)作用域是独立的:
- 脚本主体的位置参数对应你执行脚本时传入的命令行参数
- 自定义函数内部的位置参数,仅对应你调用该函数时主动传入的参数,不会自动继承脚本的命令行参数
你代码最后调用check_for_file函数时没有传入任何参数,所以函数内部的$1永远为空,$#永远等于0,和你执行脚本时传没传参数没有关系。
修复方案
只需要修改脚本最后一行的函数调用逻辑,把脚本收到的命令行参数传递给函数即可,推荐传入全部参数兼容性更好:
# 原错误写法 check_for_file # 替换为正确写法 check_for_file "$@"
修复后完整代码
check_for_file() { if [ $# -eq 0 ]; then local testing_file=myproject else local testing_file=$1 fi if [ -d "$testing_file" ]; then echo "Directory name already exists" exit else mkdir -p "$testing_file"/{archive,backups,docs/{html,txt},assets,database,src/{sh,c}} fi } check_for_file "$@"
额外优化了原代码中
[ -d $testing_file ]的变量未加引号的问题,避免目录名带空格时执行报错。
效果验证
- 执行
./mkproj.sh:无参数传入,函数会自动使用默认值myproject创建目录结构 - 执行
./mkproj.sh hello:参数hello会正常传递到函数内部,你添加的echo "$1"调试代码也能正常输出hello
内容的提问来源于stack exchange,提问作者gogo
相关产品推荐
相关产品推荐

