Bash中for循环内数组元素的正确展开与命令执行问题
Bash数组存储命令执行问题解决
原代码的问题
你写的代码里,for i in ${VAR[@]}没有给${VAR[@]}加双引号,bash会把数组元素里的空格当作分隔符,将"ls -la"拆成ls和-la两个独立的循环项。循环执行时,第一个ls正常运行,第二个-la不是合法命令,自然报错。
解决方案
方法1:用eval执行(支持单元素多命令)
如果需要在单个数组元素里放多个用分号分隔的命令,比如"ls -la ; ls -ltr",用eval可以直接解析执行,同时要给${VAR[@]}加引号保证每个元素完整传入循环:
VAR[0]="ls" VAR[1]="ls -la" VAR[2]="ls -la ; ls -ltr" for cmd in "${VAR[@]}" do eval "$cmd" done
方法2:用数组的数组(更安全,适合单命令带参数)
如果只是存储单个命令加参数,不想用eval(避免不可信命令的安全风险),可以用bash 4.0及以上支持的“数组的数组”,把每个命令和它的参数单独存为子数组:
# 定义数组的数组 VAR=( [0]=(ls) [1]=(ls -la) ) # 循环执行每个子数组里的命令 for ((i=0; i<${#VAR[@]}; i++)); do "${VAR[i][@]}" done
这种方式不会把参数拆成独立项,执行更安全,也能正确处理带空格的参数(比如echo "hello world"可以存为(echo "hello world"))。
内容的提问来源于stack exchange,提问作者justin8976
相关产品推荐
相关产品推荐

