向Bash函数传递位置参数时出现错误,寻求解决方案
解决Bash函数传参错误的问题
我来帮你排查这个问题~你遇到的核心问题是调用函数时没有把脚本收到的命令行参数传递给函数,导致函数无法正确获取到你指定的answer.sh文件。
问题分析
当你执行bash file_info.sh answer.sh时,answer.sh是脚本的位置参数$1(属于脚本层面的变量),但你定义的file_info函数内部的$1是函数自己的参数,和脚本的$1完全是两个独立的变量。你最后一行直接写file_info,相当于没有给函数传任何参数,所以函数里的$1是空值(你看到的this is .可能是特殊环境下的异常解析,但本质还是参数没传对),自然会触发else分支的用法提示。
修改方案
把脚本最后一行的file_info改成file_info "$1",这样就能把脚本收到的第一个命令行参数传递给函数了。另外,为了避免文件名包含空格、特殊字符时出问题,所有变量引用都建议加上双引号,我帮你把脚本里的潜在问题也一并修正了:
#! /usr/local/bin/bash program=$(basename "$0") file_info () { # file_info: function to display file information. echo "this is $1" if [[ -e "$1" ]]; then echo "Parameter 1 eq $1" echo -e "\nFile Type:" file "$1" echo -e "\n File Status:" stat "$1" else echo "$program: usage: $program file" >&2 return 1 fi } file_info "$1"
补充说明
- 加双引号的作用:比如如果你的文件名是
my file.sh,不加双引号的话,脚本会把它拆成两个参数my和file.sh,导致识别错误;加双引号就能完整保留文件名的原样。 - 修改后再执行
bash file_info.sh answer.sh,函数就能正确拿到answer.sh这个参数,进入if分支显示文件的类型和状态了。
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

