如何在Bash脚本间传递字符串名称?字符串参数空白异常排查
解决Bash脚本传递字符串参数为空的问题
嘿,我来帮你搞定这个问题!你遇到的情况很典型——整数变量都能正常传递,唯独字符串namelist.input在第二个脚本里显示为空,问题大概率出在你传递这个参数的写法上,再加上可能第二个脚本的参数解析逻辑没适配好。
首先修正参数传递的写法
你写的$'namelist.input'是Bash的ANSI-C转义字符串语法,但这里你的文件名没有需要转义的特殊字符(比如换行、制表符),这种写法反而会让解析逻辑混乱。直接改成下面两种方式之一就行:
- 如果文件名没有空格或特殊字符,直接写:
./change_date_2_4_new.sh -v year4=$year4 -v month4=$month4 ... -v namelist=namelist.input - 如果文件名有空格、引号这类特殊字符,用双引号包裹:
./change_date_2_4_new.sh -v year4=$year4 ... -v namelist="namelist with space.input"
检查第二个脚本的参数解析逻辑
假设你的change_date_2_4_new.sh是用getopts来处理-v选项的,那要确保它能正确解析字符串赋值。比如正确的解析逻辑应该是这样的:
#!/bin/bash while getopts "v:" opt; do case $opt in v) # 直接执行传递过来的赋值语句,比如"namelist=namelist.input" eval "$OPTARG" ;; *) echo "无效选项: -$OPTARG" >&2 exit 1 ;; esac done # 测试输出 echo "namelist的值是: $namelist"
如果你的脚本里没有用eval来执行-v后面的赋值语句,那字符串变量肯定会是空的——因为脚本只是拿到了namelist=namelist.input这个字符串,没有把它变成实际的变量赋值。
更稳妥的替代方案:用环境变量传递
如果不想折腾-v选项的解析,直接把字符串变量作为环境变量传递更简单,而且不容易出错:
# 把namelist作为环境变量传给第二个脚本 namelist="namelist.input" ./change_date_2_4_new.sh -v year4=$year4 -v month4=$month4 ...
然后在change_date_2_4_new.sh里直接用$namelist就能拿到值,完全不用额外解析参数。
内容的提问来源于stack exchange,提问作者Barry
相关产品推荐
相关产品推荐

