大家好,感谢您的支持!
我在 bash 脚本中通过 =~ 操作数使用 REGEX 时遇到问题。
环境:GNU bash,版本 4.1.7(1)-release (powerpc-ibm-aix5.1.0.0)
bash-4.1$ if [[ a =~ a ]]; then echo match; fi
Segmentation fault(coredump)
bash版本:
bash-4.1$ bash --version
GNU bash, version 4.1.7(1)-release (powerpc-ibm-aix5.1.0.0)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
我正在寻找识别给定参数是否为整数的最佳方法,因为我需要确保给定参数是PID(进程号) 在Linux中我总是使用=~
我一直无法找到解决方案。我在网上搜索过但找不到类似的东西。
先感谢您
答案1
如果可能的话,我会使用 bash 测试 $pid 之外的其他方法。
我会使用kill
orawk
代替:
1 - 仅检查 $pid 是否是 AIX 上的(有效、正在运行)进程:
kill -s 0 -- "$pid" && echo "pid $pid is a running process"
注意:这不会杀死进程,信号 0 仅在 $pid 存在时起作用。
然而(感谢 @ChrisDavies 在评论中指出!):“...您必须是进程(或根)的所有者,以避免出现“不允许操作”错误”
2 - 如果您不确定是否获得了正确的列(这种情况在 ps 输出中经常发生,因为第一列(USER)可以以空格开头,也可以不以空格开头,具体取决于用户名的长度):
您可能需要在输入行之前添加一个空格:
ps ... | sed -e 's/^/ /' | awk -v pid="$pid" ' something on column $pid '
:这将帮助 awk(以及排序和其他所有内容)不会在第一列或第二列($1 或 $2)中错误地看到某些 pid,具体取决于“第一”列的内容是否以空格开头。
3 - 为了完全避免这个问题,您还可以使用自定义 ps :您仍然需要 sed,因为较短的 pid 将以空格开头,而最长的则不会!
ps -e -o 'pid, ppid, user, etime, args' \
| sed -e 's/^/ /' \
| awk '
BEGIN {
col_pid=1; col_ppid=2; col_user=3; col_etime=4 start_args=5
}
( $col_pid !~ "/^[0-9]+$/ ) {
print "line: " FNR " : column " col_pid " does NOT match a number? : \047" $col_pid "\047"
}
'
# you could also do the sed part with awk, but it would : recompute $0, losing spacings