尝试动态捕获特定别名命令的列表,并存储以供稍后在脚本中执行。我想动态捕获,因为此脚本将使用不同的命令针对多个服务器上的多个用户运行。 IE:server1可能具有“ statcmd1”,2和3;而server2仅具有“ statcmd2”。还有更多,但这就是我遇到的问题。我猜想数组设置方式不对吗?也许还有另一种方法。
测试:
#!/bin/bash
source $HOME/.bash_profile #Aliases are set in here
# Capture the set aliases into array. It will omit the actual command and only pick up the alias name.
ALL_STAT=($(alias | grep "control.sh" | awk '{print $2}'| awk -F '=' '{print $1}' | grep -F "stat"))
#Execute the status of all elements listed in the array
for i in ${ALL_STAT[@]}; do $i; done
执行:
[user@server]$ ./test.sh
./test.sh: line 16: statcmd1: command not found
./test.sh: line 16: statcmd2: command not found
./test.sh: line 16: statcmd3: command not found
在脚本之外执行别名命令:
[user@server]$ statcmd1
RUNNING
[user@server]$ statcmd2
RUNNING
[user@server]$ statcmd3
RUNNING
答案 0 :(得分:2)
根据Bash Reference Manual,别名扩展是在变量扩展之前之前执行的。因此,$i
的扩展甚至都没有尝试作为别名扩展。
您可以改用函数。在变量扩展后 执行命令/功能。实际上,manual还说:
对于几乎所有目的,shell函数优先于别名。
答案 1 :(得分:2)
在bash联机帮助页上:
当外壳不是交互式的时,别名不会扩展,除非 expand_aliases shell选项是使用shopt设置的(请参见 下面的SHELL BUILTIN COMMANDS下的小商店描述)。
执行
shopt -s expand_aliases
在执行命令之前-之后,脚本中还将提供所有别名。
此外,由于别名扩展发生在变量扩展之前,因此必须在eval
的帮助下对该行进行两次评估:
#!/bin/bash
source $HOME/.bash_profile #Aliases are set in here
# Capture the set aliases into array. It will omit the actual command and only pick up the alias name.
ALL_STAT=($(alias | grep "control.sh" | awk '{print $2}'| awk -F '=' '{print $1}' | grep -F "stat"))
shopt -s expand_aliases
#Execute the status of all elements listed in the array
for i in ${ALL_STAT[@]}
do
eval "$i"
done