将别名命令名称捕获到数组中。然后在For循环中执行每个操作

时间:2018-07-16 21:17:41

标签: arrays bash for-loop alias

尝试动态捕获特定别名命令的列表,并存储以供稍后在脚本中执行。我想动态捕获,因为此脚本将使用不同的命令针对多个服务器上的多个用户运行。 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

2 个答案:

答案 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