Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 将变量传递到使用awk的函数中_Function_Variables_Awk_Parameter Passing_Aix - Fatal编程技术网

Function 将变量传递到使用awk的函数中

Function 将变量传递到使用awk的函数中,function,variables,awk,parameter-passing,aix,Function,Variables,Awk,Parameter Passing,Aix,我有一个脚本,它试图按名称停止某个进程(但我需要指定一个不能终止的字符串,即“notThisProcess”),然后在20秒后终止它,如果它没有正常运行,即: #!/bin/ksh bname=BTEST bserver=BSERVER PROCESS_ID=`ps auxww | awk '/PROCESS_NAME_ALPHA/ && !/awk/ && !/notThisProcess/ {print $2}'` /apps/customapp/stopc

我有一个脚本,它试图按名称停止某个进程(但我需要指定一个不能终止的字符串,即“notThisProcess”),然后在20秒后终止它,如果它没有正常运行,即:

#!/bin/ksh
bname=BTEST
bserver=BSERVER

PROCESS_ID=`ps auxww | awk '/PROCESS_NAME_ALPHA/ && !/awk/ && !/notThisProcess/ {print $2}'`
/apps/customapp/stopcommand -a $bname -processName PROCESS_NAME_ALPHA -serverName $bserver
sleep 20
kill -4 $PROCESS_ID

PROCESS_ID2=`ps auxww | awk '/PROCESS_NAME_BETA/ && !/awk/ && !/notThisProcess/ {print $2}'`
/apps/customapp/stopcommand -a $bname -processName PROCESS_NAME_BETA -serverName $bserver
sleep 20
kill -4 $PROCESS_ID2

#etc..
随着我的进程列表的增加,我试图将这些步骤放入一个函数中,但我不知道如何将进程名称传递给awk。也就是说,这不起作用:

#!/bin/ksh
bname=BTEST
bserver=BSERVER

cycleProcess()
{
PROCESS_ID=`ps auxww | awk '/$1/ && !/awk/ && !/notThisProcess/ {print $2}'`
/apps/customapp/stopcommand -a $bname -processName PROCESS_NAME_ALPHA -serverName $bserver
sleep 20
kill -4 $PROCESS_ID
}

cycleProcess PROCESS_NAME_ALPHA
cycleProcess PROCESS_NAME_BETA

exit

我已经看过好几篇关于通过-v分配的文章,但是尽管有几次尝试,我还是没有成功。有什么建议吗?

您可以在管道字符分隔列表中传递建议,并与最后一个字段进行比较

ps ... | awk -v keep="process1|process2|process3"  '$NF!~keep{print $2}'

还请注意,在脚本
awk'/$1/&&&…
中,变量不是bash变量,而是传递给
awk
脚本的第一个字段。

您可以在管道字符分隔列表中传递它们,并与最后一个字段进行比较

ps ... | awk -v keep="process1|process2|process3"  '$NF!~keep{print $2}'

还要注意的是,在脚本
awk'/$1/&&…
中,变量不是bash变量,而是传递给
awk
脚本的第一个字段。

我会这样写:

#!/bin/ksh
bname=BTEST
bserver=BSERVER

cycleProcess() {
    typeset procname="$1"
    typeset pid=$(ps auxww | awk -v name="$procname" '$0 ~ name && !/awk/ && !/notThisProcess/ {print $2}')
    if [[ -z "$pid" ]]; then
        echo "$procname is not running"
        return
    fi
    /apps/customapp/stopcommand -a "$bname" -processName "$procname" -serverName "$bserver"
    sleep 20
    kill -4 "$pid"
}

processes=(
    PROCESS_NAME_ALPHA
    PROCESS_NAME_BETA
)

for proc in "${processes[@]}"; do 
    cycleProcess "$proc"
done
函数中的
typeset
是将变量声明为该函数的局部变量的一种方法

我没有访问AIX box的权限
ps auxww
output on my Linux box在字段11中显示命令名,因此不是
/name/&&/awk/&/此脚本/
您可能可以使用
$11==name{print$2}

或者
$11~name
如果匹配不准确。

我会这样写:

#!/bin/ksh
bname=BTEST
bserver=BSERVER

cycleProcess() {
    typeset procname="$1"
    typeset pid=$(ps auxww | awk -v name="$procname" '$0 ~ name && !/awk/ && !/notThisProcess/ {print $2}')
    if [[ -z "$pid" ]]; then
        echo "$procname is not running"
        return
    fi
    /apps/customapp/stopcommand -a "$bname" -processName "$procname" -serverName "$bserver"
    sleep 20
    kill -4 "$pid"
}

processes=(
    PROCESS_NAME_ALPHA
    PROCESS_NAME_BETA
)

for proc in "${processes[@]}"; do 
    cycleProcess "$proc"
done
函数中的
typeset
是将变量声明为该函数的局部变量的一种方法

我没有访问AIX box的权限
ps auxww
output on my Linux box在字段11中显示命令名,因此不是
/name/&&/awk/&/此脚本/
您可能可以使用
$11==name{print$2}

或者
$11~name
如果匹配不准确。

如其他人所述,可以使用选项-v将shell变量传递给awk脚本。如果awk脚本驻留在单独的文件中(通过使用选项-f),则必须使用此选项

在单引号(“…”)之间直接在shell脚本中指定awk脚本时,还可以使用构造$shell_变量”。请注意,执行此操作时,单引号和双引号之间不得有空格

例如:

process_string="plugin-container"

pids=$( ps -fu $LOGNAME | awk '/'"$process_string"'/ { print $2 }' )

正如其他人已经指出的,可以使用选项-v将shell变量传递给awk脚本。如果awk脚本驻留在单独的文件中(通过使用选项-f),则必须使用此选项

在单引号(“…”)之间直接在shell脚本中指定awk脚本时,还可以使用构造$shell_变量”。请注意,执行此操作时,单引号和双引号之间不得有空格

例如:

process_string="plugin-container"

pids=$( ps -fu $LOGNAME | awk '/'"$process_string"'/ { print $2 }' )

美丽的!非常感谢,效果很好。第22行有一个小小的错误,你就有一个额外的}。奇怪的是,它只影响进程列表中的最后一个进程。感谢您提供的优雅解决方案!谢谢,打字错误修正了。在右大括号之后,额外的大括号只是一个常规字符:
a=(1234);echo“${a[@]}”
漂亮!非常感谢,效果很好。第22行有一个小小的错误,你就有一个额外的}。奇怪的是,它只影响进程列表中的最后一个进程。感谢您提供的优雅解决方案!谢谢,打字错误修正了。在右大括号之后,额外的大括号只是一个常规字符:
a=(1234);回显“${a[@]}”