如何在Shell脚本中选择并存储可用Linux命令到变量供后续执行?
嘿,你的需求完全可以实现,不过先给你指出现有脚本里的一个小bug,再详细讲几种把命令存入变量后续执行的靠谱方式~
先修正你现有脚本的逻辑错误
你脚本里的第二个elif条件写错了,应该判断$b2而不是$b1,不然永远只会匹配第一个if分支,根本不会走到cmd2的判断。另外,捕获退出码的时候不用echo $?再赋值,直接b1=$?更简洁。修正后的脚本如下:
# 执行cmd1并捕获退出码 linux cmd1 > /dev/null 2>&1 b1=$? # 执行cmd2并捕获退出码 linux cmd2 > /dev/null 2>&1 b2=$? # 修正判断逻辑 if [ $b1 -eq 0 ]; then cmd="linux cmd1" elif [ $b2 -eq 0 ]; then cmd="linux cmd2" else echo "No utility found to check blah blah..." exit 1 # 建议退出脚本,避免后续执行无效命令 fi # 后续执行变量中的命令 $cmd
把Linux命令存入变量的几种正确姿势
根据命令的复杂度,有几种不同的存储方式,各有优劣:
1. 简单命令:直接存为字符串
如果你的命令没有复杂参数(比如没有空格、通配符、管道等shell特殊语法),直接把命令作为字符串存在变量里就行,后续直接用$cmd执行,就像上面的例子一样。
2. 带特殊参数的命令:用数组存储
如果命令包含空格、带空格的路径、通配符等,用字符串存储会出现分词错误(比如把带空格的路径拆成两个参数)。这时候强烈推荐用数组来存储命令和参数:
# 比如要存储的命令是:ls -l "/my documents/photos" cmd_arr=(ls -l "/my documents/photos") # 后续执行时用数组展开,能正确保留参数的完整性 "${cmd_arr[@]}"
这种方式能完美处理参数里的特殊字符,避免意外的分词问题。
3. 复杂逻辑命令:用函数替代变量
如果你的命令涉及多步操作、条件判断或者需要重复调用,与其把命令存在变量里,不如直接定义一个函数,可读性和安全性都更高:
# 定义检查cmd1是否可用的函数 check_cmd1() { linux cmd1 > /dev/null 2>&1 return $? } # 定义执行cmd1的函数 run_cmd1() { linux cmd1 } # 同理定义cmd2的检查和执行函数 check_cmd2() { linux cmd2 > /dev/null 2>&1 return $? } run_cmd2() { linux cmd2 } # 逻辑判断 if check_cmd1; then run_cmd1 elif check_cmd2; then run_cmd2 else echo "No utility found to check blah blah..." exit 1 fi
重要注意事项
- 尽量避免用
eval $cmd执行变量里的命令:除非你100%确定变量的内容是安全的,否则eval会解析变量里的所有shell语法,可能被注入恶意命令,存在安全风险。 - 如果命令包含管道、重定向等shell语法(比如
ls | grep txt),字符串或数组存储都会失效,这时候最好用函数来封装整个命令逻辑,或者把命令写成一个单独的小脚本调用。
内容的提问来源于stack exchange,提问作者dig_123
相关产品推荐
相关产品推荐

